2013-10-12 4 views
5

파이썬에서는 추상 메서드에서 데코레이터를 파생 된 구현으로 가져 오는 방법이 있습니까? 추상 메서드 데코레이터

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

예를 들어

,의 my_method는 지금까지 내가 말할 수있는 some_decorator 장식되지 않습니다. 각각의 파생 된 클래스를 개별적으로 장식하지 않고도 이런 일이 발생할 수있는 방법이 있나요? Foo?

+0

광범위한 마법을 가지고서 만, 나는 두려워합니다. 추상 메소드'_my_method'를 호출하고 기본적으로'some_decorator (self._my_method) (* args, ** kwds)'를 수행하는 추상화되지 않은 재정의 된'my_method'를 갖는 대안입니까? – 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