2013-10-12 50 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 

SubFoomy_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