2011-09-13 13 views
29

क्या पाइथन में स्थिर निर्माता के रूप में ऐसी कोई चीज है?क्या Python में एक स्थिर कन्स्ट्रक्टर या स्थिर प्रारंभकर्ता है?

मैं पायथन में एक स्थिर निर्माता को कैसे कार्यान्वित करूं?

यहां मेरा कोड है ... __init__ आग लगती है जब मैं इस तरह ऐप कहता हूं। __init__ एक स्थिर कन्स्ट्रक्टर या स्थैतिक प्रारंभकर्ता नहीं है।

App.EmailQueue.DoSomething() 

मैं इसे इस है, जो अनुप्रयोग वर्ग हर बार को दर्शाता है की तरह कॉल करनी होगी:

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

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

__init__ बुला हर बार है के साथ समस्या:

App().EmailQueue.DoSomething() 

यहाँ मेरी वर्ग है कि ऐप ऑब्जेक्ट फिर से बनाया जाता है। मेरी "वास्तविक" ऐप कक्षा काफी लंबी है।

+5

आप क्यों नहीं बस है कि कोड सही नहीं डाला वर्ग को परिभाषित करने के बाद? या आप आलसी शुरुआत के लिए पूछ रहे हैं? – SLaks

उत्तर

15

संकेत: self का संदर्भ देने वाले किसी भी वर्ग को कक्षा के तत्काल आवश्यकता की आवश्यकता होगी। आप इसे इस तरह से कर सकते हैं:

class App: 
    email_queue = EmailQueue() 

App.email_queue.DoSomething() 

लेकिन आओ, यह बहुत सारे फ्लाफ की तरह लगता है। मैं स्लाक्स के साथ हूं, बस कक्षा के बाहर इसे शुरू करें। वैकल्पिक रूप से, आप singleton pattern देख सकते हैं।

18

स्थिर और गतिशील भाषाओं के बीच एक मौलिक अंतर है जो पहले हमेशा स्पष्ट नहीं होता है।

एक स्थिर भाषा में, कक्षा को संकलित समय में परिभाषित किया गया है और प्रोग्राम सब कुछ अच्छा है और कार्यक्रम चलाने से पहले ठोस में सेट है।

एक गतिशील भाषा में, कक्षा वास्तव में रनटाइम पर परिभाषित की जाती है। जैसे ही दुभाषिया पार्स और उन सभी वर्गों और डीफ स्टेटमेंट को निष्पादित करना शुरू कर देता है, एक स्थिर कन्स्ट्रक्टर के बराबर चल रहा है। उस बिंदु पर वर्ग परिभाषाएं निष्पादित की जा रही हैं।

आप कक्षा निकाय के अंदर कहीं भी कई बयान डाल सकते हैं और वे प्रभावी रूप से एक स्थिर निर्माता हैं। यदि आप चाहते हैं, तो आप उन्हें एक ऐसे फ़ंक्शन में रख सकते हैं जो पैरामीटर के रूप में self नहीं लेता है, और कक्षा के अंत में उस फ़ंक्शन को कॉल करता है।

+1

क्या आपने वास्तव में उन सभी को एक ऐसे फ़ंक्शन में रखने का प्रयास किया है जो स्वयं को नहीं लेता है और कक्षा कॉल के अंत में कार्य करता है? यह उतना ही आगे नहीं है जितना लगता है क्योंकि वर्ग तब तक नहीं बनाया गया है जब वह फ़ंक्शन चलता है। –

2

आप अपने अनुप्रयोग का दृष्टांत करने की जरूरत है, तो है कि बजाय का उपयोग करें:

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

अच्छा बिंदु। ओपी ने इस तथ्य को झुका दिया कि यह "हर बार" तत्काल हो जाता है। –

संबंधित मुद्दे