कक्षाएं भी पाइथन में ऑब्जेक्ट्स हैं। इसलिए, उन्हें चर के लिए असाइन किया जा सकता है और उनके स्वयं के गुण होते हैं, जैसा कि किसी भी अन्य वस्तु के समान होता है।
class
ब्लॉक में आपके द्वारा बनाए गए सभी नाम बनाए गए वर्ग के गुण बन जाते हैं। वे उस कक्षा के भविष्य के उदाहरणों के गुण हैं। लेकिन जब आप किसी उदाहरण से एक विशेषता को पढ़ने का प्रयास करते हैं और उदाहरण में उस विशेषता नहीं होती है, तो पायथन इंस्टॉलेशन के क्लास 'विशेषताओं को देखने के लिए डिफ़ॉल्ट होता है, और यदि उसे कोई मिलता है तो उसे वापस कर देगा। वास्तव में पाइथन में विधियां कैसे काम करती हैं; वे कक्षा में केवल गुण हैं, और जब आप उन्हें उदाहरण से पुनर्प्राप्त करने का प्रयास करते हैं (जहां वे मौजूद नहीं हैं) वे कक्षा को देखकर पाए जाते हैं।
इस बात को ध्यान में रखते हुए, आपका प्रोग्राम ऐसा नहीं करता जो आपको लगता है।
class exampleClass(object):
attribute1=0
attribute2="string"
यहाँ आप दो विशेषताओं attribute1
और attribute2
के साथ एक कक्षा exampleClass
नाम है, बना लिया है। वे उदाहरण विशेषताओं हैं; यह पाइथन सीखने वाले लोगों की वास्तव में एक आम गलती है। आपको इसे स्वयं से प्रशिक्षित करने की ज़रूरत है, क्योंकि सरल उदाहरणों के लिए यह अक्सर "जैसे" काम करने लगता है, वे उदाहरण गुण थे। class
ब्लॉक में बाध्यकारी नाम क्लास ऑब्जेक्ट पर गुण बनाता है। उदाहरण विशेषताओं को बनाने का एकमात्र तरीका यह है कि उदाहरण के बाद उदाहरण का संदर्भ प्राप्त करें और उस पर विशेषताओं को असाइन करें; पाइथन आपको यह करने के लिए स्थान के रूप में __init__
विधि (जिसे इंस्टेंस बनाया जाता है) कहा जाता है।
तो अंगूठे का मूल नियम यह है: कक्षा ब्लॉक में परिभाषित नाम क्लास ऑब्जेक्ट पर गुण हैं, के गुणों के रूप में निर्दिष्ट नाम __init__
उस वर्ग के सभी उदाहरणों पर गुण हैं।
आपका भ्रम आगे एक और मुद्दा का संयोजन होता है:
x=exampleClass
x.attribute1=20
x.attribute2="Foo"
क्योंकि कक्षाएं अजगर में सब कुछ की तरह वस्तुओं, इस पूरी तरह से उचित अजगर कोड है कर रहे हैं, लेकिन यह आप क्या सोचते हैं यह करता है नहीं करता है। आपने वास्तव में अपनी कक्षा का उदाहरण नहीं बनाया है; इसके लिए आपको कक्षा को exampleClass()
में कॉल करने की आवश्यकता है। नंगे नाम exampleClass
बस क्लास ऑब्जेक्ट को संदर्भित करता है, इसलिए आपने उस ऑब्जेक्ट पर x
नाम को बाध्य कर दिया है और फिर इसके कुछ विशेषताओं को असाइन किया है। स्वाभाविक रूप से, जब आप क्लास ऑब्जेक्ट पर y
को बाध्य करते हैं और y
के माध्यम से उस ऑब्जेक्ट पर विशेषताओं को असाइन करते हैं, तो x
द्वारा निर्दिष्ट ऑब्जेक्ट प्रभावित होता है (यह वही ऑब्जेक्ट है)।
संक्षिप्त उत्तर: 'x' और 'y' दोनों क्लास ऑब्जेक्ट' exampleClass' को संदर्भित करते हैं, इसके उदाहरण नहीं। उदाहरण बनाने के लिए, आपको क्लास ऑब्जेक्ट को 'x = exampleClass()' में कॉल करने की आवश्यकता है। बाद में आपके द्वारा 'x' में किए गए परिवर्तनों को केवल उस उदाहरण को प्रभावित किया जाएगा जो इसका संदर्भ देता है। – martineau