आपने जो लिखा है, आप एक महत्वपूर्ण समझ को याद कर रहे हैं: एक वर्ग और एक वस्तु के बीच का अंतर। __init__एक वर्ग को इनिशियलाइज़ नहीं करता है, यह एक क्लास या ऑब्जेक्ट का एक उदाहरण इनिशियलाइज़ करता है। प्रत्येक कुत्ते का रंग होता है, लेकिन एक वर्ग के रूप में कुत्ते नहीं होते हैं। प्रत्येक कुत्ते के चार या कम पैर होते हैं, लेकिन कुत्तों का वर्ग नहीं करता है। वर्ग किसी वस्तु की अवधारणा है। जब आप फिदो और स्पॉट को देखते हैं, तो आप उनकी समानता, उनके कुत्तेपन को पहचानते हैं। वह वर्ग है।
जब आप कहें
class Dog:
def __init__(self, legs, colour):
self.legs = legs
self.colour = colour
fido = Dog(4, "brown")
spot = Dog(3, "mostly yellow")
आप कह रहे हैं, फ़िदो एक भूरे रंग का कुत्ता है जिसके 4 पैर हैं जबकि स्पॉट एक अपंग है और ज्यादातर पीला है। __init__समारोह एक निर्माता कहा जाता है, या प्रारंभकर्ता, और जब आप एक वर्ग का एक नया उदाहरण बनाने के लिए स्वचालित रूप से कहा जाता है। उस फ़ंक्शन के भीतर, नए बनाए गए ऑब्जेक्ट को पैरामीटर को सौंपा गया है self। संकेतन self.legsएक विशेषता है जिसे legsचर में वस्तु कहा जाता है self। विशेषताएँ तरह तरह के चर हैं, लेकिन वे किसी वस्तु की स्थिति या वस्तु के लिए उपलब्ध विशेष क्रियाओं (कार्यों) का वर्णन करते हैं।
हालांकि, ध्यान दें कि आप colourस्वयं कुत्ते के लिए निर्धारित नहीं करते हैं - यह एक अमूर्त अवधारणा है। ऐसी विशेषताएँ हैं जो कक्षाओं में समझ में आती हैं। उदाहरण के लिए, population_sizeएक ऐसा है - इससे फ़िदो को गिनने का कोई मतलब नहीं है क्योंकि फ़िदो हमेशा एक है। यह कुत्तों की गिनती करने के लिए समझ में आता है। बता दें कि दुनिया में 200 मिलियन कुत्ते हैं। यह डॉग क्लास की संपत्ति है। फिदो का 200 मिलियन की संख्या से कोई लेना-देना नहीं है, न ही स्पॉट। यह एक "वर्ग विशेषता" कहा जाता है के रूप में "उदाहरण के गुण" है कि कर रहे हैं करने के लिए विरोध कर रहा है colourया legsइसके बाद के संस्करण।
अब, कुछ कम कैनाइन और अधिक प्रोग्रामिंग-संबंधी। जैसा कि मैंने नीचे लिखा है, चीजों को जोड़ने के लिए वर्ग समझदार नहीं है - यह किस वर्ग का है? पायथन में कक्षाएं विभिन्न डेटा के संग्रह से बनती हैं, जो समान व्यवहार करती हैं। कुत्तों के वर्ग में फ़िदो और स्पॉट शामिल हैं और 199999999998 उनके जैसे अन्य जानवर हैं, ये सभी लैम्पपोस्ट पर झाँकते हैं। चीजों को जोड़ने के लिए कक्षा में क्या है? उनके द्वारा निहित डेटा से क्या वे भिन्न होते हैं? और वे किन कार्यों को साझा करते हैं?
हालांकि, संख्या ... वे अधिक दिलचस्प विषय हैं। कहते हैं, इंटेगर। उनमें से एक बहुत कुछ है, कुत्तों की तुलना में बहुत अधिक है। मुझे पता है कि पायथन में पहले से ही पूर्णांक हैं, लेकिन चलो गूंगा खेलते हैं और उन्हें फिर से लागू करते हैं (पायथन के पूर्णांक को धोखा देकर और उपयोग करके)।
तो, इंटेगर एक वर्ग हैं। उनके पास कुछ डेटा (मूल्य), और कुछ व्यवहार हैं ("मुझे इस अन्य संख्या में जोड़ें")। आइये इसे दिखाते हैं:
class MyInteger:
def __init__(self, newvalue)
# imagine self as an index card.
# under the heading of "value", we will write
# the contents of the variable newvalue.
self.value = newvalue
def add(self, other):
# when an integer wants to add itself to another integer,
# we'll take their values and add them together,
# then make a new integer with the result value.
return MyInteger(self.value + other.value)
three = MyInteger(3)
# three now contains an object of class MyInteger
# three.value is now 3
five = MyInteger(5)
# five now contains an object of class MyInteger
# five.value is now 5
eight = three.add(five)
# here, we invoked the three's behaviour of adding another integer
# now, eight.value is three.value + five.value = 3 + 5 = 8
print eight.value
# ==> 8
यह थोड़ा नाजुक है (हम मान रहे हैं कि यह otherMyInteger होगा), लेकिन अब हम इसे अनदेखा कर देंगे। वास्तविक कोड में, हम नहीं करेंगे; हम इसे सुनिश्चित करने के लिए परीक्षण करेंगे, और हो सकता है कि इसे ज़ब्त भी करें ("आप एक पूर्णांक नहीं हैं; उल्लास से, आपके पास एक बनने के लिए 10 नैनोसेकंड हैं! 9 ... 8 ....")
हम भिन्नों को भी परिभाषित कर सकते हैं। अंशों को भी पता है कि खुद को कैसे जोड़ना है।
class MyFraction:
def __init__(self, newnumerator, newdenominator)
self.numerator = newnumerator
self.denominator = newdenominator
# because every fraction is described by these two things
def add(self, other):
newdenominator = self.denominator * other.denominator
newnumerator = self.numerator * other.denominator + self.denominator * other.numerator
return MyFraction(newnumerator, newdenominator)
पूर्णांक की तुलना में और भी अधिक भिन्न हैं (वास्तव में नहीं, लेकिन कंप्यूटर यह नहीं जानते हैं)। चलो दो बनाते हैं:
half = MyFraction(1, 2)
third = MyFraction(1, 3)
five_sixths = half.add(third)
print five_sixths.numerator
# ==> 5
print five_sixths.denominator
# ==> 6
आप वास्तव में यहां कुछ भी घोषित नहीं कर रहे हैं। विशेषताएँ एक नए प्रकार के चर की तरह हैं। सामान्य चर का केवल एक मूल्य होता है। हम कहते हैं कि तुम लिखो colour = "grey"। आपके पास नाम का एक और चर नहीं हो सकता colourहै "fuchsia"- कोड में एक ही स्थान पर नहीं है।
ऐरे उसे एक हद तक हल करते हैं। यदि आप कहते हैं colour = ["grey", "fuchsia"], आपने चर में दो रंगों को ढेर किया है, लेकिन आप उन्हें उनकी स्थिति (0, या 1, इस मामले में) से अलग करते हैं।
विशेषताएँ वे चर हैं जो किसी वस्तु से बंधे होते हैं। सरणियों की तरह, हमारे पास विभिन्न कुत्तों परcolour , बहुत सारे चर हो सकते हैं । तो, एक चर है, लेकिन एक और है। पहले एक चर के भीतर वस्तु के लिए बाध्य है ; दूसरा । अब, जब आप कॉल करते हैं , या , हमेशा एक अदृश्य पैरामीटर होगा, जिसे पैरामीटर सूची के सामने स्थित अतिरिक्त झूलने के लिए सौंपा जाएगा। इसे पारंपरिक रूप से कहा जाता है , और डॉट के सामने ऑब्जेक्ट का मूल्य मिलेगा। इस प्रकार, डॉग के भीतर (कंस्ट्रक्टर), जो भी नया डॉग होगा वह बाहर हो जाएगा; भीतर की , चर में वस्तु के लिए बाध्य होंगे । इस प्रकार,fido.colourspot.colourfidospotDog(4, "brown")three.add(five)self__init__selfMyIntegeraddselfthreethree.valueके बाहर वैसा ही चर होगा add, जैसा कि self.valueभीतर है add।
यदि मैं कहता हूं the_mangy_one = fido, तो मैं fidoअभी तक किसी अन्य नाम के रूप में ज्ञात वस्तु का उल्लेख करना शुरू कर दूंगा । अब से, fido.colourबिल्कुल वैसा ही जैसा कि वैरिएबल है the_mangy_one.colour।
तो, अंदर की बातें __init__। आप उन्हें डॉग के जन्म प्रमाण पत्र में ध्यान देने योग्य बातें समझ सकते हैं। colourअपने आप में एक यादृच्छिक चर है, इसमें कुछ भी हो सकता है। fido.colourया self.colourडॉग की पहचान पत्र पर एक फार्म क्षेत्र की तरह है; और __init__क्लर्क इसे पहली बार भर रहा है।
कोई क्लीयर?
संपादित करें : नीचे टिप्पणी पर विस्तार:
आप वस्तुओं की एक सूची मतलब है , है ना?
सबसे पहले, fidoवास्तव में एक वस्तु नहीं है। यह एक चर है, जो वर्तमान में एक वस्तु से युक्त है, ठीक उसी तरह जब आप कहते हैं x = 5, xएक चर वर्तमान में संख्या पांच है। यदि आप बाद में अपना दिमाग बदलते हैं, तो आप fido = Cat(4, "pleasing")(जब तक आप एक वर्ग बना सकते हैं Cat) कर सकते हैं, और fidoतब से एक बिल्ली ऑब्जेक्ट "समाहित" कर सकते हैं। यदि आप करते हैं fido = x, तो इसमें पांच नंबर होगा, न कि एक पशु वस्तु।
जब तक आप विशेष रूप से उन पर नज़र रखने के लिए कोड नहीं लिखते हैं, तब तक एक वर्ग अपने उदाहरणों को नहीं जानता है। उदाहरण के लिए:
class Cat:
census = [] #define census array
def __init__(self, legs, colour):
self.colour = colour
self.legs = legs
Cat.census.append(self)
यहाँ, censusकक्षा का एक वर्ग-स्तरीय गुण है Cat।
fluffy = Cat(4, "white")
spark = Cat(4, "fiery")
Cat.census
# ==> [<__main__.Cat instance at 0x108982cb0>, <__main__.Cat instance at 0x108982e18>]
# or something like that
ध्यान दें कि आपको नहीं मिलेगा [fluffy, sparky]। वे सिर्फ चर नाम हैं। यदि आप चाहते हैं कि बिल्लियों के पास नाम हों, तो आपको नाम के लिए एक अलग विशेषता बनानी होगी, और फिर __str__इस नाम को वापस करने की विधि को ओवरराइड करना होगा । इस विधि का (यानी क्लास-बाउंड फंक्शन, बस की तरह addया __init__) उद्देश्य यह वर्णन करना है कि ऑब्जेक्ट को स्ट्रिंग में कैसे परिवर्तित किया जाए, जैसे कि आप इसे प्रिंट करते हैं।