में ग्लोबल्स और सिंगलेट्स मेरे पास कुछ पायदान हैं जो मेरे पायथन एप्लिकेशन में व्यापक हैं और जिनके पास केवल एक वैश्विक उदाहरण होना चाहिए (जैसे लॉगर, डीबीकनेक्शन)। पायथन कक्षा में स्थैतिक चर/विधियों का समर्थन नहीं करता है, इसलिए यहां एक सिंगलटन बनाने के लिए सामान्य जावा/सी ++ तरीका काम नहीं करता है। मैंने पाइथन में सिंगलटन को लागू करने के विकल्पों की तलाश की है। मैं एक साधारण (यदि संभव हो तो कोई मेट्रोग्रामिंग नहीं) और स्वच्छ कार्यान्वयन चाहता हूं। यह अच्छा लग रहा है:पाइथन
class MyClass(object):
def a():
pass
singleton = MyClass()
सिंगलटन का उपयोग के रूप में
import myClass
myClass.singleton.a()
प्रत्यक्ष काम एक रचना समारोह द्वारा प्रतिस्थापित किया जा सकता है अगर वस्तु प्रारंभ इतना आसान नहीं है आसान होगा।
मैं मॉड्यूल स्कोप में getInstance() भी बना सकता हूं और हमेशा myObj प्राप्त करने के लिए इसका उपयोग कर सकता हूं।
प्रश्न 1) यह ठीक काम करता है? मॉड्यूल कोड (myObj असाइनमेंट) केवल पहली बार चलाता है जब इसे किसी अन्य मॉड्यूल में आयात किया जाता है और जब भी मैं इस मॉड्यूल को कहीं भी आयात करता हूं तो myObj नहीं बनाया जाएगा?
मैंने देखा है कि एक वैकल्पिक विधि एक ग्लोबल्स मॉड्यूल का उपयोग करना है। की तरह कुछ:
from myClass1 import MyClass1
from myClass2 import MyClass2
myObj1 = MyClass1()
myObj2 = MyClass2()
इस का उपयोग करते हुए:
import globals
globals.myObj1.a()
मैं पहली बार विकल्प पसंद करते हैं।
प्रश्न 2) 2 समाधानों के बीच, आप क्या सलाह देते हैं?
प्रश्न 3) एक तीसरा समाधान कई वर्गों/कार्यों के लिए लॉगर जैसे व्यापक वस्तुओं को पारित करेगा, लेकिन यह एक अच्छा समाधान नहीं है। क्या यहां कोई बेहतर समाधान नहीं बताया गया है?
मैं वैश्विक चर और सिंगलेट्स का उपयोग करने के डाउनसाइड्स से अवगत हूं। हालांकि, मेरे आवेदन में वैश्विक स्थिति होने का कोई बड़ा मुद्दा नहीं है। मैं ऐसे समाधान पसंद करूंगा जिनमें कोड स्पष्टता हो और उपयोग करने में आसान हो।
आपके प्रश्न का प्रीमियर गलत है। पहला, पायथन स्थैतिक तरीकों और चर का समर्थन करता है। दूसरा, आप लॉगिंग और डेटाबेस पहुंच के लिए मौजूदा मानक पुस्तकालयों का उपयोग क्यों नहीं कर रहे हैं? –
पायथन सीधे स्थिर तरीकों/चर का समर्थन करता है (कोई एनोटेशन हैक नहीं)? आपका दूसरा प्रश्न इस मुद्दे से विचलित हो जाता है (सिंगलटन कार्यान्वयन), किसी एकल वर्ग द्वारा लॉगिंग/डीबी एक्सेस क्लास को प्रतिस्थापित करें और यह किसी एप्लिकेशन में व्यापक रूप से उपयोग किया जाता है। –