2011-09-13 2 views
29

Existe-t-il un constructeur statique en Python?Existe-t-il un constructeur statique ou un initialiseur statique en Python?

Comment implémenter un constructeur statique en Python?

Voici mon code ... Le __init__ ne se déclenche pas lorsque j'appelle App comme ceci. Le __init__ n'est pas un constructeur statique ou un initialiseur statique.

App.EmailQueue.DoSomething() 

Je dois l'appeler comme ça, qui instancie la classe App chaque fois:

App().EmailQueue.DoSomething() 

Voici ma classe:

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

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

Le problème appelant __init__ chaque fois est que l'objet App soit recréé Ma "vraie" classe App est assez longue.

+5

Pourquoi ne pas vous mettre juste ce code juste après la définition de la classe? Ou demandez-vous une initialisation paresseuse? – SLaks

Répondre

15

Indice: tout ce qui fait référence à self nécessitera une instanciation de la classe. Vous pouvez le faire comme ceci:

class App: 
    email_queue = EmailQueue() 

App.email_queue.DoSomething() 

Mais allez, ça a l'air de beaucoup de peluches. Je suis avec SLaks, juste l'initialiser en dehors de la classe. Alternativement, vous pouvez regarder dans le singleton pattern.

18

Il existe une différence fondamentale entre les langages statiques et dynamiques qui n'est pas toujours apparente au premier abord.

Dans un langage statique, la classe est définie au moment de la compilation et tout est sympa et défini concrètement avant que le programme s'exécute.

Dans un langage dynamique, la classe est définie lors de l'exécution. Dès que l'interpréteur analyse et commence à exécuter toutes ces classes et instructions def, l'équivalent d'un constructeur statique est en cours d'exécution. Les définitions de classe sont en cours d'exécution à ce stade.

Vous pouvez placer un nombre quelconque d'instructions n'importe où dans le corps de la classe et elles sont en effet un constructeur statique. Si vous le souhaitez, vous pouvez les placer tous dans une fonction qui ne prend pas self comme paramètre et appeler cette fonction à la fin de la classe.

+1

Avez-vous réellement essayé de les placer tous dans une fonction qui ne prend pas self et à la fin de l'appel de classe cette fonction? Ce n'est pas aussi simple que ça en a l'air parce que la classe n'a pas encore été créée quand cette fonction est exécutée. –

2

Vous devez instancier votre application, utilisez qu'au lieu:

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

Bon point. L'OP a déploré le fait qu'il soit instancié "à chaque fois". –

Questions connexes