Когда декоратор уровня класса украшает? - PullRequest
0 голосов
/ 04 февраля 2019

Я создал декоратор для декорирования всех методов экземпляра класса.Я написал следующий код, чтобы сделать это.

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

Теперь я пытаюсь понять, как это работает, я имею в виду, когда это украшение произойдет и как я могу это проверить?

a)Это уже случилось?

б) Когда я впервые получаю доступ к классу спама?Например,

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

в) Когда я впервые создаю экземпляр класса Spam?Например,

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

1 Ответ

0 голосов
/ 04 февраля 2019

На самом деле это легко увидеть в действии, если добавить несколько строк для печати:

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>

Короче говоря, ответ очень похож на то, что сказал @jonrsharpeэто уже случилось.Просто представьте, что визуальное поможет.

...