2011-09-13 28 views
29

¿Hay algo así como un constructor estático en Python?¿Hay un constructor estático o un inicializador estático en Python?

¿Cómo implemento un constructor estático en Python?

Aquí está mi código ... El __init__ no se dispara cuando llamo a la aplicación de esta manera. El __init__ no es un constructor estático o un inicializador estático.

App.EmailQueue.DoSomething() 

tengo que llamarlo como este, que crea la instancia de la clase de aplicaciones cada vez que:

App().EmailQueue.DoSomething() 

Aquí es mi clase:

class App: 
    def __init__(self): 
     self._mailQueue = EmailQueue() 

    @property 
    def EmailQueue(self): 
     return self._mailQueue 

El problema con llamar __init__ cada vez que se que el objeto de la aplicación se vuelva a crear Mi clase de aplicación "real" es bastante larga.

+5

¿Por qué no acaba de poner ese código justo después de la definición de la clase? ¿O estás pidiendo una inicialización lenta? – SLaks

Respuesta

15

Sugerencia: cualquier cosa que haga referencia a self va a requerir una instanciación de la clase. Podría hacerlo así:

class App: 
    email_queue = EmailQueue() 

App.email_queue.DoSomething() 

Pero vamos, parece una gran cantidad de pelusa. Estoy con SLaks, solo inicialízalo fuera de la clase. Alternativamente, puede buscar en el singleton pattern.

18

Hay una diferencia fundamental entre los lenguajes estáticos y dinámicos que no siempre es evidente al principio.

En un lenguaje estático, la clase se define en tiempo de compilación y todo está bien y configurado en concreto antes de que el programa se ejecute.

En un lenguaje dinámico, la clase realmente se define en tiempo de ejecución. Tan pronto como el intérprete analiza y comienza a ejecutar todas esas clases y sentencias def, se está ejecutando el equivalente de un constructor estático. Las definiciones de clase se están ejecutando en ese punto.

Puede poner cualquier número de declaraciones en cualquier lugar dentro del cuerpo de la clase y en efecto son un constructor estático. Si lo desea, puede colocarlos todos en una función que no tome self como parámetro, y llame a esa función al final de la clase.

+1

¿Has intentado 'colocarlos todos en una función que no se autoejecuta y al final de la clase llamar a esa función'? Eso no es tan sencillo como suena porque la clase aún no se ha creado cuando se ejecuta esa función. –

2

Es necesario crear una instancia de la aplicación, a continuación, utilizar ese lugar:

myApp = App() 
myApp.EmailQueue.DoSomething() 
+0

Buen punto. El OP lamentó el hecho de que se ejemplifica "cada vez". –

Cuestiones relacionadas