यद्यपि स्वीकृत एवर ऑन है, मैं थोड़ा वर्णन जोड़ना चाहूंगा।
चलो एक छोटा सा व्यायाम करते हैं
सबसे पहले एक वर्ग को इस प्रकार परिभाषित करें:
class A:
temp = 'Skyharbor'
def __init__(self, x):
self.x = x
def change(self, y):
self.temp = y
तो हमें यहां क्या करना है?
- हमारे पास एक बहुत ही सरल वर्ग है जिसमें एक विशेषता है
tempजो एक स्ट्रिंग है
- एक
__init__विधि जो सेट करती हैself.x
- एक परिवर्तन विधि सेट करती है
self.temp
बहुत सीधे आगे अब तक हाँ? अब हम इस वर्ग के साथ खेलना शुरू करते हैं। आइए पहले इस वर्ग को शुरू करें:
a = A('Tesseract')
अब निम्नलिखित करें:
>>> print(a.temp)
Skyharbor
>>> print(A.temp)
Skyharbor
ठीक है, a.tempउम्मीद के मुताबिक A.tempकाम किया लेकिन नरक कैसे हुआ ? खैर यह काम किया क्योंकि अस्थायी एक वर्ग विशेषता है। अजगर में सब कुछ एक वस्तु है। यहाँ A भी वर्ग की एक वस्तु है type। इस प्रकार विशेषता अस्थायी Aवर्ग द्वारा आयोजित एक विशेषता है और यदि आप A(और नहीं के माध्यम से a) अस्थायी के मूल्य को बदलते हैं , तो परिवर्तित मूल्य Aवर्ग के सभी उदाहरणों में परिलक्षित होने वाला है । आइये आगे बढ़ते हैं और करते हैं:
>>> A.temp = 'Monuments'
>>> print(A.temp)
Monuments
>>> print(a.temp)
Monuments
दिलचस्प है ना? और ध्यान दें कि id(a.temp)और id(A.temp)अब भी वही कर रहे हैं ।
किसी भी पायथन ऑब्जेक्ट को स्वचालित रूप से एक __dict__विशेषता दी जाती है , जिसमें उसकी विशेषताओं की सूची होती है। आइए देखें कि इस उदाहरण में हमारे उदाहरण वस्तुओं के लिए क्या है:
>>> print(A.__dict__)
{
'change': <function change at 0x7f5e26fee6e0>,
'__module__': '__main__',
'__init__': <function __init__ at 0x7f5e26fee668>,
'temp': 'Monuments',
'__doc__': None
}
>>> print(a.__dict__)
{x: 'Tesseract'}
ध्यान दें कि tempविशेषता Aवर्ग की विशेषताओं xमें सूचीबद्ध है जबकि उदाहरण के लिए सूचीबद्ध है।
तो कैसे आए कि हम एक परिभाषित मूल्य प्राप्त करें a.tempअगर यह भी उदाहरण के लिए सूचीबद्ध नहीं है a। खैर यह __getattribute__()विधि का जादू है । पायथन में बिंदीदार वाक्यविन्यास स्वचालित रूप से इस पद्धति को लागू करता है इसलिए जब हम लिखते हैं a.temp, तो पायथन निष्पादित होता है a.__getattribute__('temp')। वह विधि विशेषता लुकअप क्रिया करती है, अर्थात अलग-अलग स्थानों में देख कर विशेषता का मान प्राप्त करती है।
किसी वस्तु के __getattribute__()पहले आंतरिक शब्दकोश ( तानाशाही ) की खोज का मानक कार्यान्वयन , फिर वस्तु का प्रकार। इस मामले में a.__getattribute__('temp')पहले a.__dict__['temp']और फिर निष्पादित करता हैa.__class__.__dict__['temp']
ठीक है अब चलो हमारी changeविधि का उपयोग करें :
>>> a.change('Intervals')
>>> print(a.temp)
Intervals
>>> print(A.temp)
Monuments
खैर अब जो हमने उपयोग किया है self, print(a.temp)वह हमें एक अलग मूल्य देता है print(A.temp)।
अब यदि हम तुलना करते हैं id(a.temp)और id(A.temp), वे अलग होंगे।
listविशेषता नाम के रूप में उपयोग न करें ।listएक नई सूची बनाने के लिए एक अंतर्निहित कार्य है। आपको नाम अक्षर के साथ बड़े अक्षर लिखने चाहिए।