【发布时间】:2021-05-09 19:42:29
【问题描述】:
我认为以下内容可以用作装饰器
class D:
def __init__(self, func):
self.func = func
def __call__(self, *args, **kwargs):
return self.func(*args, **kwargs)
class A:
@D
def f(self, x):
pass
a=A()
a.f(1)
但我得到TypeError: f() missing 1 required positional argument: 'x'
这是怎么回事,有没有办法像这样使用类作为装饰器?
【问题讨论】:
-
Related: stackoverflow.com/questions/51542063/… 问题是你试图装饰一个实例方法,而不是你用一个类来实现装饰器
-
确切的问题是
self.func(*args, **kwargs)没有将self参数传递给self.func(即A.f)。如果你添加self(self.func(self, *args, **kwargs)) 你会遇到另一个问题:这里的self指的是D实例,而不是A实例。事实上,我不确定是否可以使用作为类实现的装饰器来装饰实例方法。你可能需要用一个函数来实现它 -
其实如果
D是一个描述符也是可以的。查看我标记的副本 -
“重复”不是。可能还有其他问题可以解决这个问题,但你标记的问题是关于使用普通函数装饰方法 - 根本没有提到使用类时所需的调整。
-
D,作为一个类,是可调用的,但不是你定义的装饰器。那是D()(除了装饰要用作方法的函数引起的描述符问题)。
标签: python