मेरे पास एक कक्षा है जिसमें मानक पायथन सिंगलटन फॉर्म है जिसका उपयोग मैं करता हूं। यह एक सिंगल वैल्यू भी करता है, लेकिन प्रत्येक इंस्टेंस में इसे इटिट करने के बजाए, जब मैं सिंगलटन हैंडलिंग करता हूं तो इसे __new__()
में लगाता हूं। क्या यह करने के लिए यह पाइथोनिक तरीका है? यदि नहीं, तो मैं और कैसे कर सकता हूं?क्या यह __new__ में काम करने के लिए एक 'मूल पाप' है? यदि हां, तो सिंगलेट्स के लिए एक बार इनिट को कैसे संभालना सबसे अच्छा है?
class Foo(object):
_inst = None
def __new__(cls, val):
if Foo._inst is None:
Foo._inst = super(Foo, self).__new__(cls)
Foo._inst.val = val
return Foo._inst
यह स्पष्ट रूप से सरलीकृत रूप है। मैंने तक प्रतीक्षा करने के लिए Foo._inst
को एक सिंगलटन के लिए एक बार चलने के लिए सेट करने के लिए उपयोग किया है, लेकिन यह एक बहुप्रचारित स्थिति में सिंक्रनाइज़ेशन त्रुटियों के लिए परिपक्व लगता है। ऐसी परिस्थितियों के लिए जहां मौजूदा मान में कोई भी मान नहीं है जो __init__()
फिर से चलाया जाता है, __init__()
में init डालने में कोई हानि नहीं है, सिवाय इसके कि आप कोड चला रहे हैं जो प्रभावी रूप से कुछ भी नहीं करता है जब आपको आवश्यकता नहीं होती है, लेकिन अक्सर भ्रष्ट राज्य मूल्य होते हैं जिन्हें मैं ओवरराइट नहीं करना चाहता हूं। मुझे पता है कि सिंगलेट भी बुराई हैं, लेकिन कुछ बार, वे सबसे अच्छे समाधान हैं (जैसे विशेष उपयोग प्रकारों को परिभाषित करना, मैं is
के साथ जांच करने में सक्षम होना चाहता हूं)।
ऐसा लगता है कि मैं सबसे अच्छा समाधान कर सकता हूं, लेकिन मुझे __new__()
में उदाहरण मानों को गंदे शुरू करना लगता है। क्या किसी के पास इस तरीके को बेहतर तरीके से संभालने के बारे में विचार है?
सिंगलेट्स का उपयोग करने के लिए यह एक मूल पाप है। वे ग्लोबल्स को अतिरिक्त दोष और अजीब प्रतिबंध जोड़ने का एक तरीका हैं। यदि आपको वैश्विक स्थिति की आवश्यकता है, तो ग्लोबल्स का उपयोग करें, लेकिन उनसे बचने के लिए बेहतर प्रयास करें। कभी भी सिंगलेट का उपयोग न करें। –
@ स्वेन मार्नच मैं अकेले सिंगलटन और ग्लोबल्स से बचने के लिए क्या कर सकता हूं, लेकिन ऐसे कई उदाहरण हैं जहां वे सबसे अच्छे समाधान हैं। उदाहरण के लिए, मैंने अभी एक टर्नरी कक्षा लागू की है, लेकिन मुझे प्रत्येक प्रकार के एक से अधिक उदाहरण (सही, गलत, अज्ञात) की आवश्यकता नहीं है, और वास्तव में, प्रत्येक में से केवल एक को मुझे इसे बूल की तरह उपयोग करने की अनुमति देता है काम करने के लिए ऑपरेटर है। इसलिए जब सिंगलटन से बचा जाना है, तो उन्हें सबसे अच्छा विकल्प होने पर उनका उपयोग करने के अच्छे तरीके हो सकते हैं। –
क्या आपका मतलब "कार्डिनल पाप" नहीं है? –