首页 > 解决方案 > Python。绑定方法、Mixins 和类装饰器

问题描述

我遇到了一个非常烦人的特殊问题。我希望有人能告诉我。首先,我有一个延迟函数返回值的类装饰器,在这种情况下,我将让它不做任何事情来简化事情。

class MyDecorator(object):
    def __init__(self, func, *args):
        self.func = func

    def __call__(self, *args, **kwargs):
        return self.func(*args, **kwargs)

    @classmethod
    def decorate(cls, func, delay=0):
        return cls(func, delay)

然后我有一个 mixin,它有一个带有所需参数的方法,我在这个方法上附加了这个装饰器。

class MyMixin(object):
    @MyDecorator.decorate
    def my_method(self, arg1, *args, **kwargs):
        pass

然后我使用我的 Mixin

class MyImplementation(MyMixin, object):
    pass

m = MyImplementation()
m.my_method('my first argument')

然后我得到错误

TypeError: my_method() missing 1 required positional argument: 'arg1'

对于那些想知道的人,参数“我的第一个参数”实际上替换了 self,因为 self 没有被传递甚至无法访问,因此需要另一个参数 arg1。

现在我知道为什么会发生这种情况,用类装饰器包装方法会创建一个对象,而不是一个函数,并且对象不能绑定到一个类。我有一些如何克服它的想法(最直接的是元类实现,但由于我试图做的事情的本质是一个不能很好工作的混入)。我只是在寻找一些关于如何在将方法提供给装饰器之前将方法绑定到实例的建议(这似乎很奇怪,这不会自动发生,但我想 staticmethod 和 classmethod 要求这不会发生)这样我就不必定义构造函数(因为你好,Mixin)。

标签: pythonpython-3.xdecoratormixins

解决方案


推荐阅读