蟒蛇。绑定方法,混合器和类装饰器

时间:2018-11-08 12:09:02

标签: python python-3.x decorator 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。

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

0 个答案:

没有答案