2013-10-12 10 views
5

In Python gibt es eine Möglichkeit, einen Dekorator auf einer abstrakten Methode zu den abgeleiteten Implementierung (en) durchführen zu lassen?Decorators auf abstrakte Methoden

Zum Beispiel in

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 nicht mit some_decorator eingerichtet bekommen, soweit ich das beurteilen kann. Gibt es eine Möglichkeit, dies zu erreichen, ohne jede abgeleitete Klasse von Foo individuell dekorieren zu müssen?

+0

Nur mit umfangreicher Magie, fürchte ich. Ist es eine Alternative, die abstrakte Methode '_my_method' aufzurufen und eine nicht-abstrakte, nicht-überschriebene' my_method' zu haben, die grundsätzlich 'some_decorator (self._my_method) (* args, ** kwds)'? – delnan

+0

@delnan Hmm, yeah, ich hatte gehofft, dass es eine Lösung geben könnte, die irgendwo zwischen metaklassischer Magie und deinem guten Vorschlag liegt, der etwas sauberer ist. Aber ich werde tun, was ich tun muss, denke ich. –

Antwort

0

Meine Lösung würde die Superklassenmethode erweitern, ohne sie zu überschreiben.

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 
Verwandte Themen