装饰者1:
def dec(f):
def wrap(obj, *args, **kwargs):
f(obj, *args,**kwargs)
return wrap
装饰者2:
class dec:
def __init__(self, f):
self.f = f
def __call__(self, obj, *args, **kwargs):
self.f(obj, *args, **kwargs)
示例类
class Test:
@dec
def disp(self, *args, **kwargs):
print(*args,**kwargs)
以下代码适用于装饰器1,但不适用于装饰器2.
a = Test()
a.disp("Message")
我不明白为什么装饰师2不在这里工作。有人可以帮我这个吗?
答案 0 :(得分:2)
当您使用dec
类进行装饰时,disp
方法不再是实例方法,而是类dec
的实例。所以a.disp
只是Test
的普通成员,它恰好是可调用的,因为它有一个__call__
方法,并且在自己作为f
的第一个参数传递实例是"Message"
(它绝不限于“测试”实例)。
使用装饰器功能:
a = Test()
print a.disp
# disp <bound method Test.wrap of <__main__.Test instance at 0xb739df0c>>
使用装饰器类:
a = Test()
print a.disp
# disp <__main__.dec instance at 0xb739deec>
修改强> 这应该比我更好,更清楚地回答你的问题: