#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
себя. Декораторы просто применяются в момент использования, а затем забываются.