在Python3中没有绑定方法(在Python2中已知),但我们总是创建函数。
在类中声明一个函数后,会创建自动Python描述符,当这个函数作为实例方法被调用时,它将附加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的实例
发布于 2013-02-01 23:47:07
类C需要是一个descriptor,即实现__get__。然后,X().f()将首先调用描述符的__get__,传递X实例和对X的引用。无论__get__返回什么,都将看到__call__被调用。
https://stackoverflow.com/questions/14648975
复制相似问题