2012-08-24 23 views
5

Me gustaría ejecutar automáticamente algún código en la creación de clase que puede llamar a otros métodos de clase. No he encontrado una forma de hacerlo desde la propia declaración de clase y termino creando un @classmethod llamado __clsinit__ y llamándolo desde el ámbito de definición inmediatamente después de la declaración de clase. ¿Hay algún método que pueda definir para que se llame automáticamente después de crear el objeto de la clase?Llamar a un método de clase al crear las clases de Python

+2

¿Creación de clases o creación de instancias? Porque ambos se pueden hacer, pero la respuesta es diferente dependiendo. –

+1

Puede usar metaclases para esto. Ver por ejemplo [esta pregunta] (http://stackoverflow.com/questions/100003/what-is-a-metaclass-in-python). – BrenBarn

+6

Aparte: Por favor, no invente '__special_methods__'. Eso está reservado para el lenguaje Python. Use un '_single_underscore_prefix' si desea que sea privado. – delnan

Respuesta

10

Puede hacerlo con metaclass o class decorator.

Un decorador de clase (desde 2,6) es probablemente más fácil de entender:

def call_clsinit(cls): 
    cls._clsinit() 
    return cls 

@call_clsinit 
class MyClass: 
    @classmethod 
    def _clsinit(cls): 
     print "MyClass._clsinit()" 

metaclases son más poderosos; pueden invocar el código y modificar los ingredientes de la clase antes de que se cree y después (también se pueden heredar):

def call_clsinit(*args, **kwargs): 
    cls = type(*args, **kwargs) 
    cls._clsinit() 
    return cls; 

class MyClass(object): 
    __metaclass__ = call_clsinit 

    @classmethod 
    def _clsinit(cls): 
     print "MyClass._clsinit()" 
+2

Agregaría que, al menos desde el texto de la pregunta, es difícil decir por qué '__new__' o' __init__' no solucionan el problema. –

Cuestiones relacionadas