2013-08-20 11 views
6

मैं उस वर्ग ऑब्जेक्ट के लिए एक पाइथन क्लास ऑब्जेक्ट को __name__ विशेषता के बीच रिश्ते को समझने की कोशिश कर रहा हूं। उदाहरण के लिए:पायथन क्लास वेरिएबल नाम बनाम __name__

In [1]: class Foo(object): 
    ...:  pass 
    ...: 

In [2]: Foo.__name__ = 'Bar' 

In [3]: Foo.__name__ 
Out[3]: 'Bar' 

In [4]: Foo 
Out[4]: __main__.Bar 

In [5]: Bar 
--------------------------------------------------------------------------- 
NameError         Traceback (most recent call last) 
<ipython-input-5-962d3beb4fd6> in <module>() 
----> 1 Bar 

NameError: name 'Bar' is not defined 

तो ऐसा लगता है जैसे मैं वर्ग के __name__ विशेषता को बदल दिया है, लेकिन मैं उस नाम से यह उल्लेख करने के लिए नहीं कर सकते। मुझे पता है कि यह थोड़ा सामान्य है लेकिन क्या कोई Foo और Foo.__name__ के बीच संबंधों को समझा सकता है?

+4

हालांकि यह आपके प्रश्न का सीधे जवाब नहीं देता है, मैं सुझाव देता हूं कि नेड बैटचेल्डर्स [पाइथन नामों और मूल्यों के बारे में तथ्यों और मिथकों को पढ़ना] (http://nedbatchelder.com/text/names.html)। मुझे लगता है कि आप इसे पढ़ने के बाद अपने स्वयं के प्रश्न का उत्तर देने में सक्षम होंगे। –

+0

सभी को धन्यवाद, बहुत उपयोगी जानकारी। – ACV

उत्तर

9

यह आसान है। बिल्कुल कोई रिश्ता नहीं है।

जब आप कक्षा बनाते हैं तो स्थानीय चर को आपके द्वारा उपयोग किए जाने वाले नाम के साथ बनाया जाता है, जिसे कक्षा में इंगित किया जाता है ताकि आप इसका उपयोग कर सकें।

कक्षा को एक विशेषता __name__ भी मिलती है जिसमें उस चर का नाम होता है, क्योंकि यह कुछ मामलों में आसान है, जैसे कि पिकलिंग।

आप स्थानीय चर को किसी अन्य चीज़ पर सेट कर सकते हैं, या __name__ चर बदल सकते हैं, लेकिन फिर पिकलिंग जैसी चीजें काम नहीं करेंगी, इसलिए ऐसा न करें।

+0

'__name__' को बदलने के वैध कारण हैं, हालांकि, उदा। जब आप एक कक्षा सजावट बना रहे हैं। – nneonneo

+0

ठीक है, अगर आप उस सजावट में एक पूरी तरह से अलग वर्ग लौट रहे हैं, हाँ। लेकिन फिर आप उस वर्ग को 'टाइप()' कॉल के साथ भी बना सकते हैं, जो '__name__' सेट करता है। इस तरह मैंने इसे देखा है। –

3

__name__ केवल यह जानने के लिए कि यह वास्तव में किस प्रकार का उदाहरण है, केवल आत्म-पहचान है।

दूसरी बात यह है कि जिस तरह से इसका उपयोग किया जा सकता है। यदि आप इसे फिर से असाइन करते हैं तो यह भिन्न हो सकता है।

वे दोनों कक्षा को परिभाषित करते समय असाइन किए जाते हैं।

यह फ़ंक्शंस के साथ समान तरीके से काम करता है: यदि आप def उन्हें दिए गए हैं, तो उन्हें दिए गए नाम पर असाइन किया जाता है और उन्हें संबंधित __name__ विशेषता मिलती है।

ओटीओएच, यदि आपके पास lambda फ़ंक्शन है, तो यह __name__<lambda> की विशेषता प्राप्त करता है, क्योंकि यह उस नाम को नहीं जानता है जिसे यह सौंपा गया है।

1

लघु संस्करण

class Foo(object): pass एक वर्ग बनाता है और स्थानीय नाम Foo करने के लिए इसे प्रदान करती है।

Foo.__name__ = 'Bar'__name__ विशेषता के लिए एक नया मान निर्दिष्ट करता है। संलग्न गुंजाइश प्रभावित नहीं है।

लांग संस्करण

वर्ग बयान एक वर्ग बनाता है और स्थानीय दायरे में प्रदान किए गए नाम को प्रदान करती है। एक वर्ग पायथन बनाने के दौरान कक्षा को उस नाम को बताता है जिसे इसे कक्षा के __name__ विशेषता में निर्दिष्ट करके बनाया गया था।

किसी वर्ग की विशेषता को असाइन करने से स्थानीय दायरे में नाम लागू नहीं होता है। इसलिए गुणों में कोई भी परिवर्तन (जैसे कि __name__) संलग्न क्षेत्र को प्रभावित नहीं करता है।

0

आपको यह ध्यान रखना होगा कि पाइथन में एक वर्ग किसी अन्य की तरह एक वस्तु है। किसी ऑब्जेक्ट को उस गुण को शामिल करने के लिए यह समझ में नहीं आता है जो ऑब्जेक्ट को संदर्भित करने वाले चर से जुड़ा हुआ था, क्योंकि इसमें संदर्भित किसी भी प्रकार के चर नाम हो सकते हैं।जब भी आप एक असाइनमेंट लिखते हैं (Bar = Foo) या किसी फ़ंक्शन पर ऑब्जेक्ट पास करते हैं, तो आपके पास एक नया संदर्भ है। स्वाभाविक रूप से सभी वस्तुओं को स्वतंत्र किया जाना चाहिए कि उनका संदर्भ कैसे दिया जाता है।

__name__ क्लास ऑब्जेक्ट से जुड़ी जानकारी का एक टुकड़ा है, जो वैरिएबल नाम के समान होता है जो इसे प्रारंभ में असाइन किया गया है।

संबंधित मुद्दे