2013-10-12 17 views
5

In python, c'è un modo per far passare un decoratore su un metodo astratto alle implementazioni derivate?Decoratori su metodi astratti

Per esempio, 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 non andranno decorato con some_decorator per quanto posso dire. C'è un modo in cui posso farlo accadere senza dover decorare individualmente ogni classe derivata di Foo?

+0

Solo con grande magia, temo. È un'alternativa chiamare il metodo astratto '_my_method' e avere un' my_method' non astratto, non sovrascritto, che fondamentalmente fa 'some_decorator (self._my_method) (* args, ** kwds)'? – delnan

+0

@delnan Hmm, sì, speravo che potesse esserci una soluzione da qualche parte tra la grande metaclatura magica e il tuo buon suggerimento che è un po 'più pulito. Ma farò quello che devo fare immagino. –

risposta

0

La mia soluzione estenderebbe il metodo della superclasse senza sovrascriverlo.

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 
Problemi correlati