Decora una clase en Python definiendo el decorador como una clase

¿Qué es un ejemplo simple de decorar una clase al definir al decorador como una clase?

Estoy tratando de lograr lo que se ha implementado en Python 2.6 utilizando PEP 3129, excepto el uso de clases que no funcionan como lo explica Bruce Eckel aquí .

Los siguientes trabajos:

class Decorator(object): def __init__(self, arg): self.arg = arg def __call__(self, cls): def wrappedClass(*args): return cls(*args) return type("TestClass", (cls,), dict(newMethod=self.newMethod, classattr=self.arg)) def newMethod(self, value): return value * 2 @Decorator("decorated class") class TestClass(object): def __init__(self): self.name = "TestClass" print "init %s"%self.name def TestMethodInTestClass(self): print "test method in test class" def newMethod(self, value): return value * 3 

Excepto, en lo anterior, wrapClass no es una clase, sino una función manipulada para devolver un tipo de clase. Me gustaría escribir el mismo que se llama a continuación:

 def __call__(self, cls): class wrappedClass(cls): def __init__(self): ... some code here ... return wrappedClass 

¿Cómo se haría esto?

No estoy del todo seguro de lo que pasa en “” “… código aquí …” “”

Si desea sobrescribir new_method() , simplemente hágalo:

 class Decorator(object): def __init__(self, arg): self.arg = arg def __call__(self, cls): class Wrapped(cls): classattr = self.arg def new_method(self, value): return value * 2 return Wrapped @Decorator("decorated class") class TestClass(object): def new_method(self, value): return value * 3 

Si no desea modificar __init__() , no necesita sobrescribirlo.

Después de esto, la clase NormalClass se convierte en una instancia de ClassWrapper:

 def decorator(decor_arg): class ClassWrapper: def __init__(self, cls): self.other_class = cls def __call__(self,*cls_ars): other = self.other_class(*cls_ars) other.field += decor_arg return other return ClassWrapper @decorator(" is now decorated.") class NormalClass: def __init__(self, name): self.field = name def __repr__(self): return str(self.field) 

Prueba:

 if __name__ == "__main__": A = NormalClass('A'); B = NormalClass('B'); print A print B print NormalClass.__class__ 

Salida:

 A is now decorated. 
B is now decorated.
\__main__.classWrapper