再补充l大。原po的class A 小修如下,有两个成员
class A(object):
func = T1(lambda self: None)
def func2(self):
pass
成员 func 是属性,也是 @T1 的等价结果,指向一个T1实例
成员 func2 是方法
b = A().func 指向该T1实例
b() 会调用 T1之成员 __call__,相当于 T1.__call__(b)
接着执行 return b.func()
相当于 return (lambda self:None)()
缺少self之错误便由此而来
想修饰的 func 并没有成为 a=A() 的 bound method
※ 引述《lycantrope (阿宽)》之铭言:
: ※ 引述《tsaiminghan (nahgnimiast)》之铭言:
: : class T1(object):
: : def __init__(self, func):
: : self.func = func
: : def __call__(self, *arg, **kw):
: : print('T1:', locals())
: : return self.func(*arg, **kw)
: : def T2(func):
: : def wrapper(*arg, **kw):
: : print(locals())
: : return func(*arg, **kw)
: : return wrapper
: 讲错还请高手指正
: @T1
: def F():
: pass
: 把decorator还原:
: def F():
: pass
: F = T1(F)
: F已经变成有implement call的 T1 class instance
: 所以在呼叫F(),locals()会带有self