Python装饰问题
装饰师1:Python装饰问题,python,decorator,Python,Decorator,装饰师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) 一
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)
下面的代码适用于decorator 1,但不适用于decorator 2
a = Test()
a.disp("Message")
我不明白为什么装饰师2不在这里工作。有人能帮我吗?当你用
dec
类装饰时,你的disp
方法不再是一个实例方法,而是类dec
的实例。因此a.disp
只是Test
的一个普通成员,它恰好是可调用的,因为它有一个\uuuuuuu调用
方法,在self-passed中,它的f
实例的第一个参数是“Message”
(它绝不绑定到“Test”实例)
使用decorator函数:
a = Test()
print a.disp
# disp <bound method Test.wrap of <__main__.Test instance at 0xb739df0c>>
a=Test()
打印a.disp
#disp
对于decorator类:
a = Test()
print a.disp
# disp <__main__.dec instance at 0xb739deec>
a=Test()
打印a.disp
#disp
编辑
这应该比我更清楚地回答你的问题:
哪个部分不工作?a=测试();a、 disp(“消息”)不适用于装饰程序2