2013-10-12 6 views
5

В python существует ли способ сделать декоратор абстрактного метода переносимым на производную реализацию (ы)?Декораторы по абстрактным методам

Например, в

import abc 

class Foo(object): 
    __metaclass__ = abc.ABCMeta 

    @abc.abstractmethod 
    @some_decorator 
    def my_method(self, x): 
     pass 

class SubFoo(Foo): 
    def my_method(self, x): 
     print x 

SubFoo «s my_method не будут украшены some_decorator насколько я могу сказать. Есть ли способ сделать это без индивидуального украшения каждого производного класса Foo?

+0

Только с обширной магией, боюсь. Альтернативно ли вызывать абстрактный метод '_my_method' и иметь не абстрактный, не переопределенный' my_method', который в основном выполняет 'some_decorator (self._my_method) (* args, ** kwds)'? – delnan

+0

@ delnan Хм, да, я надеялся, что может быть какое-то решение между обширной магией метакласса и вашим хорошим предложением, которое немного чище. Но я сделаю то, что должен сделать, я думаю. –

ответ

0

Мое решение будет расширять метод суперкласса без его переопределения.

import abc 

class Foo(object): 
    __metaclass__ = abc.ABCMeta 

    @abc.abstractmethod 
    @some_decorator 
    def my_method(self, x): 
     pass 

class SubFoo(Foo): 
    def my_method(self, x): 
     super().my_method(x) #delegating the call to the superclass 
     print x 
Смежные вопросы