Могут ли подклассы в Python наследовать декоратор родительского класса

#python #python-decorators

#python #python-декораторы

Вопрос:

Если я применю декоратор к классу:

 from flask.ext.restful import Resource

@my_decorator()
class Foo(Resource): ...
  

Будет ли он автоматически применяться к любым методам подкласса? Например, будет ли он волшебным образом применен к a_foobar_method ?

 class FooBar(Foo):

    def a_foobar_method(self):
        ...
  

Комментарии:

1. Этот декоратор даже не применяется к Foo методам.

2. Почему бы вам не попробовать и не посмотреть?

Ответ №1:

Короче говоря, нет.

 @my_decorator
class Foo(Resource): ...
  

это просто сокращение для

 class Foo(Resource): ...
Foo = my_decorator(Foo)
  

Если единственный раз, когда вы когда-либо используете Foo , — это определить FooBar , то вместе ваши две части кода эквивалентны этому:

 class Foo(Resource): ...
Foo_decorated = my_decorator(Foo)
class FooBar(Foo_decorated):
    def a_foobar_method(self):
        ...
  

Или даже к этому:

 class Foo(Resource): ...
class FooBar(my_decorator(Foo)):
    def a_foobar_method(self):
        ...
  

Реальный ответ зависит от того, что делает декоратор. В принципе, у него есть шанс увидеть методы FooBar , если он просматривает список методов после создания экземпляра класса как объекта (например, потому что он изменяет __init__ метод). Но если он проходит через методы во время его вызова и применяет некоторые изменения к каждому из них, то это не повлияет на дополнительные методы (или замененные методы) в FooBar .

Ответ №2:

Декораторы никак не «помечают» декорированный класс. Невозможно определить, написали ли вы

 @decorator
class Foo:
    pass
  

или

 class Foo:
    pass

Foo = decorator(Foo)
  

просто взглянув на Foo себя. Декораторы просто применяются в момент использования, а затем забываются.