Вы не можете использовать метод класса при определении его; в классе нет self
, а класс «испечен» еще доступен даже для любого класса.
можно рассматривать методы, как функции для использования в качестве декоратора:
class SomeClass():
def action(func):
# decorate
return wrapper
@action
def execute(self, req):
# something
Если action
определен на базовый класс, то вы должны указать имя с помощью базового класса:
class Base():
@staticmethod
def action(func):
# decorate
return wrapper
class Derived(Base):
@Base.action
def execute(self, req):
# something
Для Python 2 вам понадобится статический метод action
, так как в противном случае вы получите несвязанный метод, который будет жаловаться на то, что вы не можете вызвать его без экземпляра в качестве первого аргумента. В Python 3 вы можете оставить там декоратор @staticmethod
, по крайней мере, для декоратора.
Но учтите, что action
не может использоваться в качестве метода непосредственно; возможно, это не должно быть частью класса вообще в этот момент. Он не является частью API конечных пользователей здесь, по-видимому, декоратор не используется потребителями экземпляров этих классов.
К моменту создания и декорирования функции экземпляр (даже класс) еще не существует, поэтому вы не можете сделать это так. Что может быть сделано вместо этого, зависит от того, что должно делать «действие». – bereal
action - метод базового класса. Существует много производных классов, и каждый производный класс имеет метод, который выполняет определенную операцию. До и после каждой операции мне нужно выполнить определенные операции, которые я написал в методах базового класса. Но в каждом производном классе я должен повторить этот код. Таким образом, я создал метод, называемый действием в базовом классе, который будет действовать как декоратор. – gliese581g
@ gliese581g: Требуется ли декоратору знать, на каком классе определяется метод? –