Python装饰问题

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) 一

装饰师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)
下面的代码适用于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