2011-09-13 15 views
29

Esiste un costruttore statico in Python?C'è un costruttore statico o un inizializzatore statico in Python?

Come si implementa un costruttore statico in Python?

Ecco il mio codice ... Lo __init__ non si attiva quando chiamo App come questa. __init__ non è un costruttore statico o un inizializzatore statico.

App.EmailQueue.DoSomething() 

devo chiamare in questo modo, che crea un'istanza della classe App ogni volta:

App().EmailQueue.DoSomething() 

Qui è la mia classe:

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

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

Il problema di chiamare __init__ ogni volta è che l'oggetto App viene ricreato. La mia classe di app "reale" è piuttosto lunga.

+5

Perché non basta mettere il codice a destra dopo aver definito la classe? O stai chiedendo un'inizializzazione pigra? – SLaks

risposta

15

Suggerimento: tutto ciò che fa riferimento a self richiederà un'istanza della classe. Puoi farlo in questo modo:

class App: 
    email_queue = EmailQueue() 

App.email_queue.DoSomething() 

Ma dai, sembra un sacco di peluria. Sono con SLaks, lo inizialo appena fuori dalla classe. In alternativa, è possibile esaminare lo singleton pattern.

18

C'è una differenza fondamentale tra i linguaggi statici e dinamici che non è sempre evidente all'inizio.

In un linguaggio statico, la classe viene definita in fase di compilazione e tutto è bello e impostato in concreto prima dell'esecuzione del programma.

In un linguaggio dinamico, la classe viene effettivamente definita in fase di esecuzione. Non appena l'interprete analizza e avvia l'esecuzione di tutte le classi e le istruzioni def, viene eseguito l'equivalente di un costruttore statico. Le definizioni di classe vengono eseguite a quel punto.

È possibile inserire qualsiasi numero di istruzioni in qualsiasi parte all'interno del corpo della classe e sono effettivamente un costruttore statico. Se lo desideri, puoi inserirli tutti in una funzione che non considera self come parametro e chiamare tale funzione alla fine della classe.

+1

Hai davvero provato a metterli tutti in una funzione che non si auto e alla fine della classe chiama quella funzione? Non è così semplice come sembra, perché la classe non è ancora stata creata quando viene eseguita quella funzione. –

2

Hai bisogno di istanziare la vostra applicazione, quindi utilizzare che, invece:

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

Buon punto. L'OP ha lamentato il fatto che venga istanziato "ogni volta". –

Problemi correlati