代码之家  ›  专栏  ›  技术社区  ›  Lokesh Agrawal

类级装饰器何时装饰?

  •  0
  • Lokesh Agrawal  · 技术社区  · 7 年前

    def debug(func):
        msg = func.__name__
    
        @wraps(func)
        def wrapper(*args, **kwargs):
            print(msg)
            return func(*args, **kwargs)
        return wrapper 
    
    # Decorator for all the methods in a class
    def debugmethods(cls):
        for key, val in vars(cls).items():
            if callable(val):
                setattr(cls, key, debug(val))
        return cls
    
    @debugmethods
    class Spam:
        def foo(self):
            pass
    
        def bar(self):
            pass
    

    现在我正试图了解这是如何工作的,我的意思是什么时候装修会发生,我如何检查?

    b) 当我第一次访问垃圾邮件类时?例如。

    for key, val in Spam.__dict__.items():
            print(key, val)
    

    c) 当我第一次实例化垃圾邮件类时?例如。

     spam = Spam()
     for key, val in Spam.__dict__.items():
         print(key, val)
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   r.ook jpp    7 年前

    如果您添加几行打印行,这实际上很容易在操作中看到:

    print('Deocrator is being defined')
    def deco(cls):
        print('Decorator is called')
        cls.decorated = True
        return cls
    
    print('Foo is being defined')
    @deco
    class Foo:
        print('Foo class attributes are being set')
        def __init__(self):
            print('Foo is being instantiated')
    
    print('Foo class is being referenced in main script')
    print(f'Foo is decorated: {Foo.decorated}')
    print('Foo instance is being created in main script')
    print(Foo())
    

    Deocrator is being defined
    Foo is being defined
    Foo class attributes are being set
    Decorator is called    # <--- decoration happens immediately after definition of Foo
    Foo class is being referenced in main script
    Foo is decorated: True
    Foo instance is being created in main script
    Foo is being instantiated
    <__main__.Foo object at 0x00789150>
    

    简言之,答案很像@jornsharpe所说的,它已经发生了。只是想想视觉效果会有帮助。