Estoy tratando de encontrar la forma de usar decoradores en subclases que usan super()
. Como mi decorador de clases crea otra subclase, una clase decorada parece impedir el uso de super()
cuando cambia el className
pasado al super(className, self)
. A continuación se muestra un ejemplo:Decoradores de clase, Herencia, súper() y recursividad máxima
def class_decorator(cls):
class _DecoratedClass(cls):
def __init__(self):
return super(_DecoratedClass, self).__init__()
return _DecoratedClass
class BaseClass(object):
def __init__(self):
print "class: %s" % self.__class__.__name__
def print_class(self):
print "class: %s" % self.__class__.__name__
bc = BaseClass().print_class()
class SubClass(BaseClass):
def print_class(self):
super(SubClass, self).print_class()
sc = SubClass().print_class()
@class_decorator
class SubClassAgain(BaseClass):
def print_class(self):
super(SubClassAgain, self).print_class()
sca = SubClassAgain()
# sca.print_class() # Uncomment for maximum recursion
La salida debe ser:
class: BaseClass
class: BaseClass
class: SubClass
class: SubClass
class: _DecoratedClass
Traceback (most recent call last):
File "class_decorator_super.py", line 34, in <module>
sca.print_class()
File "class_decorator_super.py", line 31, in print_class
super(SubClassAgain, self).print_class()
...
...
RuntimeError: maximum recursion depth exceeded while calling a Python object
¿Alguien sabe de una manera de no romper una subclase que utiliza super()
cuando se utiliza un decorador? Idealmente, me gustaría reutilizar una clase de vez en cuando y simplemente decorarla sin romperla.
¡Gracias por su respuesta! Seleccioné esta respuesta porque no une la subclase con el decorador. Me di cuenta de que mi pregunta era sobre cómo usar super(), pero creo que la respuesta es no. – jamstooks