Python装饰者问题

时间:2010-05-09 08:30:40

标签: 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)

示例类

class Test:
    @dec
    def disp(self, *args, **kwargs):
        print(*args,**kwargs)

以下代码适用于装饰器1,但不适用于装饰器2.

a = Test()
a.disp("Message")

我不明白为什么装饰师2不在这里工作。有人可以帮我这个吗?

1 个答案:

答案 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>

修改 这应该比我更好,更清楚地回答你的问题:

http://irrepupavel.com/documents/python/instancemethod/