我遇到了一个非常烦人的特殊问题。我希望有人可以通过它与我交谈。首先,我有一个类装饰器,它会延迟函数的返回值,在这种情况下,我将不做任何事情来简化事情。
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)。