在 Python 3 中没有绑定方法(从 Python 2 已知),但我们总是创建函数。
在类中声明一个函数后,创建自动 Pythons 描述符,该描述符将self
作为第一个参数附加,此时该函数将作为实例方法调用。
所以基本上,下面的代码:
def funcdecorator(func):
def f(*args, **kwargs):
print('funcdecorator:', args, kwargs)
return f
class X:
@funcdecorator
def f(self):
pass
X().f()
将输出:
funcdecorator: (<__main__.X object at ...>,) {}
(第一个参数作为 传递self
)
但使用以下代码:
def classdecorator(func):
class C:
def __call__(*args, **kwargs):
print('classdecorator:', args, kwargs)
return C()
class X:
@classdecorator
def f(self):
pass
X().f()
我们得到:
classdecorator: (<__main__.C object at 0x1bbea10>,) {}
这是合乎逻辑的。
但是,是否可以从装饰器返回一个类实例并模仿它是一个函数,所以当“调用”它时,第一个传递的参数将是 的实例X
,而不是 的实例C
?