में कक्षाओं के साथ काम करते हैं मैंने समझने की कोशिश की है कि कक्षा के लिए एक निश्चित सिंगलटन सजावट कार्यान्वयन कैसे किया जाता है, लेकिन मुझे केवल भ्रमित हो गया।कैसे सजावटी पाइथन
def singleton(cls):
instance = None
@functools.wraps(cls)
def inner(*args, **kwargs):
nonlocal instance
if instance is None:
instance = cls(*args, **kwargs)
return instance
return inner
@deco
, cls = deco(cls)
के लिए एक syntatic चीनी है इस कोड में ऐसा है, जब हम अपने cls
वर्ग को परिभाषित करते हैं और इस singleton
डेकोरेटर के साथ लपेट, cls
नहीं एक वर्ग अब हो जाएगा:
कोड यह , लेकिन एक समारोह। पाइथन गतिशील रूप से खोजता है कि कौन से ऑब्जेक्ट वेरिएबल हैं, इसलिए बाद में हम अपनी कक्षा का उदाहरण बनाने का प्रयास करते हैं, और कोड की यह पंक्ति instance = cls(*args, **kwargs)
चलाती है, क्या हम अनंत रिकर्सन में नहीं जाएंगे? cls
इस समय एक कक्षा नहीं है, यह एक कार्य है, इसलिए इसे खुद को कॉल करना चाहिए, रिकर्सन में जाना।
लेकिन यह ठीक काम करता है। एक सिंगलेटोन बनाया गया है और कोई पुनरावर्तन नहीं होता है। यह कैसे काम करता है?