अजगर के साथ ध्यान में रखने की एक महत्वपूर्ण बात है जब कोड की विभिन्न बिट्स के साथ क्रियान्वित कर रहे हैं के साथ,: एक ही रास्ता है कि आस-पास काम करने के लिए, __init__()
के लिए एक विशेष अनूठा मूल्य पारित करने के लिए इस तरह के None
के रूप में है तथ्य यह है कि class
और def
कथन निष्पादित किए जाते हैं जब देखा जाता है, न केवल बाद में संग्रहीत किया जाता है। जब अजगर MyClass.__DefaultName
यह local
नाम स्थान में पहली यह खोजने की कोशिश करता देखता है ऊपर
def __init__(SELF, name = MyClass.__DefaultName):
अपने कोड में इतना - एक def
के साथ यह समझने के लिए, क्योंकि केवल एक चीज है निष्पादित किया जा रहा है जो कुछ भी ()
रों के बीच है थोड़ा आसान है , फिर मॉड्यूल (उर्फ global
) नामस्थान, और अंत में builtins
में।
class
कथन निष्पादित करते समय local
नामस्थान क्या है? यह मजेदार हिस्सा है - यह class
नेमस्पेस बन जाएगा, लेकिन फिलहाल यह अनाम है - इसलिए आप इसे नाम से संदर्भित नहीं कर सकते हैं (उर्फ MyClass
अपने कोड में) लेकिन आप सीधे किसी भी संदर्भ का संदर्भ दे सकते हैं पहले ही परिभाषित किया गया है ... और क्या परिभाषित किया गया है? आपके वर्ग उदाहरण में केवल एक चीज - __DefaultName
। तो अपने __init__
इस तरह दिखना चाहिए:
def __init__(SELF, name=__DefaultName):
ध्यान रखें कि आप MyClass._MyClass__DefaultName
बाद में नहीं बदल सकते हैं और उन परिवर्तनों को नई उदाहरणों में दिखा। क्यूं कर? क्योंकि __init__
डीईएफ़ केवल एक बार निष्पादित किया जाता है, और जो मूल्य __DefaultName
उस पल में था दूर रख ली गई है और हमेशा उपयोग किया जाएगा - जब तक आप सीधे एक नया मान जब आप एक नया उदाहरण बनाने निर्दिष्ट करें:
my_instance = MyClass(name='new name')
स्रोत
2011-10-08 15:03:35
सुनिश्चित करें [एथन के उत्तर] (http://stackoverflow.com/a/7697664/1709587) के कम सहायक स्वीकृत उत्तर को पढ़ने के लिए, जो कामकाजी वाक्यविन्यास प्रदान करता है जो आपको ऐसा करने देता है। –