2010-08-06 6 views
5

¿cómo se puede acceder al decorador desde una clase base en un niño?Acceder a un decorador en una clase para padres desde el niño en Python

Supuse (erróneamente) que el ffg. funcionaría:

class baseclass(object): 
    def __init__(self): 
     print 'hey this is the base' 

    def _deco(func): 
     def wrapper(*arg): 
      res = func(*arg) 
      print 'I\'m a decorator. This is fabulous, but that colour, so last season sweetiedarling' 
      return res 
     return wrapper 

    @_deco 
    def basefunc(self): 
     print 'I\'m a base function' 

Esta clase funciona bien, pero entonces crear una clase hija hereda de esto:

class otherclass(baseclass): 
    def __init__(self): 
     super(otherclass, self).__init__() 
     print 'other class' 


    @_deco 
    def meh(self): 
     print 'I\'m a function' 

Esto no incluso importar correctamente, mucho menos correr. @_deco no está definido. Probar baseclass._deco arroja un error de método _deco() de método libre, que no es realmente sorprendente.

Cualquier idea de cómo hacer esto, realmente me gustaría encapsular el decorador en la clase, pero no estoy casado con la idea y tendría que llamarlo en la base & la clase infantil.

+0

El caso de uso para esto es un decodificador de tiempo aproximado para un controlador de pilón. Por lo tanto, debe ser accesible desde la clase base porque hay funciones allí que tendrán que ser cronometradas, y las funciones en la clase secundaria que necesitan ser temporizadas. Supongo que la forma más sencilla sería simplemente arrancarlo de la clase. – dochead

+0

¿Podría corregir su formateo? El 'def __init__' de su clase está en la misma sangría que la definición de la clase. – MattH

Respuesta

7
class baseclass(object): 
    def __init__(self): 
     print 'hey this is the base' 

    def _deco(func): 
     def wrapper(*arg): 
      res = func(*arg) 
      print 'I\'m a decorator. This is fabulous, but that colour, so last season sweetiedarling' 
      return res 
     return wrapper 

    @_deco 
    def basefunc(self): 
     print 'I\'m a base function' 

    @_deco 
    def basefunc2(self): 
     print "I'm another base function" 

    #no more uses of _deco in this class 
    _deco = staticmethod(_deco) 
    # this is the key. it must be executed after all of the uses of _deco in 
    # the base class. this way _deco is some sort weird internal function that 
    # can be called from within the class namespace while said namespace is being 
    # created and a proper static method for subclasses or external callers. 


class otherclass(baseclass): 
    def __init__(self): 
     super(otherclass, self).__init__() 
     print 'other class' 


    @baseclass._deco 
    def meh(self): 
     print 'I\'m a function' 
+0

+1; mucho mejor que mi respuesta (ahora eliminada). – bernie

+0

Fabuloso, tendré algo de eso, eso es justo en esta temporada, cariño. (pensé que me gustaría ir con el tema.) – dochead

+0

También encontré que también puedes usar @staticmethod decorator, pero SOLO si no declaras @_deco en la clase base (que eres). Entonces, esta solución parece ajustarse mejor a la pregunta que se hace. –

Cuestiones relacionadas