सभी अच्छे उदाहरणों के साथ, आपने सरल कर दिया है कि आप वास्तव में क्या करने की कोशिश कर रहे हैं। यह अच्छा है, लेकिन यह ध्यान देने योग्य है कि जब कक्षा बनाम उदाहरण चर की बात आती है तो अजगर में बहुत लचीलापन होता है। वही विधियों के बारे में कहा जा सकता है। संभावनाओं की एक अच्छी सूची के लिए, मैं माइकल फॉक्स की नई शैली की कक्षाओं के परिचय को पढ़ने की सलाह देता हूं , विशेष रूप से खंड 6 से 6।
एक चीज जो शुरू होने पर याद रखने के लिए बहुत काम लेती है वह यह है कि अजगर जावा नहीं है। सिर्फ एक क्लिच से ज्यादा। जावा में, एक पूरे वर्ग को संकलित किया जाता है, नामस्थान रिज़ॉल्यूशन को वास्तविक सरल बनाते हैं: किसी विधि (कहीं भी) के बाहर घोषित किए गए कोई भी चर उदाहरण हैं (या, यदि स्थिर, वर्ग) चर हैं और विधियों के भीतर अंतर्निहित हैं।
अजगर के साथ, अंगूठे का भव्य नियम यह है कि तीन नामस्थान हैं जिन्हें खोजा जाता है, क्रम में, चर के लिए:
- कार्य / विधि
- वर्तमान मॉड्यूल
- Builtins
{begin pedagogy}
इसके लिए सीमित अपवाद हैं। मेरे साथ होने वाली मुख्य बात यह है कि, जब एक वर्ग परिभाषा को लोड किया जा रहा है, तो वर्ग की परिभाषा का अपना निहित नाम है। लेकिन यह केवल तब तक रहता है जब तक मॉड्यूल लोड हो रहा है, और एक विधि के भीतर पूरी तरह से बायपास हो जाता है। इस प्रकार:
>>> class A(object):
foo = 'foo'
bar = foo
>>> A.foo
'foo'
>>> A.bar
'foo'
परंतु:
>>> class B(object):
foo = 'foo'
def get_foo():
return foo
bar = get_foo()
Traceback (most recent call last):
File "<pyshell#11>", line 1, in <module>
class B(object):
File "<pyshell#11>", line 5, in B
bar = get_foo()
File "<pyshell#11>", line 4, in get_foo
return foo
NameError: global name 'foo' is not defined
{end pedagogy}
अंत में, याद रखने वाली बात यह है कि आपके पास उन किसी भी वैरिएबल तक पहुंच है, जिसे आप एक्सेस करना चाहते हैं, लेकिन संभवतः नहीं। यदि आपके लक्ष्य सरल और सीधे हैं, तो Foo.bar या self.bar के लिए जाना संभवतः पर्याप्त होगा। यदि आपका उदाहरण अधिक जटिल हो रहा है, या आप वंशानुक्रम जैसी फैंसी चीजें करना चाहते हैं (आप स्थैतिक / वर्ग विधियों को विरासत में प्राप्त कर सकते हैं!), या कक्षा के भीतर अपनी कक्षा के नाम का जिक्र करने का विचार ही आपको गलत लगता है, तो देखें। परिचय मैं जुड़ा हुआ