यद्यपि स्वीकृत एवर ऑन है, मैं थोड़ा वर्णन जोड़ना चाहूंगा।
चलो एक छोटा सा व्यायाम करते हैं
सबसे पहले एक वर्ग को इस प्रकार परिभाषित करें:
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
एक नई सूची बनाने के लिए एक अंतर्निहित कार्य है। आपको नाम अक्षर के साथ बड़े अक्षर लिखने चाहिए।