2014-04-25 4 views
29

मैं काफी अजगर करने के लिए नया हूँ, और इन पदों पर ध्यान: Python __init__ and self what do they do? और Python Classes without using def __init__(self)def __init __ (स्वयं) की उपयोगिता?

यह के साथ प्रयोग करना तथापि, के बाद, मैंने देखा है कि इन दो वर्गों जाहिरा तौर पर बराबर परिणामों

class A(object): 
    def __init__(self): 
     self.x = 'Hello' 

    def method_a(self, foo): 
     print self.x + ' ' + foo 

देना (this question)

और

class B(object): 
    x = 'Hello' 
    def method_b(self,foo): 
     print self.x + ' ' + foo 
से 0

क्या इन दोनों के बीच कोई वास्तविक अंतर है? या, आमतौर पर, __init__ किसी वर्ग के गुणों के बारे में स्वाभाविक रूप से कुछ भी बदलता है? the documentation में यह उल्लेख किया गया है कि उदाहरण बनाते समय __init__ कहा जाता है। क्या इसका मतलब है कि कक्षा B में तत्कालता से पहले स्थापित किया गया है?

उत्तर

32

हाँ, यह बाहर की जाँच:

class A(object): 
    def __init__(self): 
     self.lst = [] 

class B(object): 
    lst = [] 

और अब कोशिश:

>>> x = B() 
>>> y = B() 
>>> x.lst.append(1) 
>>> y.lst.append(2) 
>>> x.lst 
[1, 2] 
>>> x.lst is y.lst 
True 

और इस:

>>> x = A() 
>>> y = A() 
>>> x.lst.append(1) 
>>> y.lst.append(2) 
>>> x.lst 
[1] 
>>> x.lst is y.lst 
False 

इसका मतलब यह है वर्ग बी में है कि एक्स स्थापित है तत्काल से पहले?

हां, यह एक वर्ग विशेषता है (इसे उदाहरणों के बीच साझा किया जाता है)। कक्षा ए में जबकि यह एक उदाहरण विशेषता है। यह बस होता है कि तार अपरिवर्तनीय हैं, इस प्रकार आपके परिदृश्य में कोई वास्तविक अंतर नहीं है (सिवाय इसके कि कक्षा बी कम स्मृति का उपयोग करता है, क्योंकि यह सभी उदाहरणों के लिए केवल एक स्ट्रिंग को परिभाषित करता है)। लेकिन मेरे उदाहरण में एक बड़ा है।

+2

+1 मत भूलना कि जब कक्षाएं हैं ऑब्जेक्ट्स आप किसी भी समय कक्षा की विशेषता को बदल सकते हैं। 'कक्षा ए: पास; एएलएस = सूची (रेंज (6))'। – kojiro

9

पहले उदाहरण में आपके पास कक्षा के उदाहरण का चर है। यह चर केवल एक उदाहरण (स्वयं आवश्यक) के माध्यम से सुलभ है।

class A(): 
    def __init__(self): 
     self.x = 'hello' 

print A.x -> AttributeError 
print A().x -> 'hello' 

दूसरे उदाहरण में आपके पास स्थिर चर है। आप क्लास के नाम करने के लिए इस चर धन्यवाद करने के लिए उपयोग कर सकते हैं एक

class A(): 
    x = 'hello' 

print A.x -> 'hello' 
print A().x -> 'hello' 

वास्तव में आप एक स्थिर चर और एक ही नाम के साथ एक उदाहरण चर हो सकता है:

class A(): 
    x = 'hello' 
    def __init__(self): 
     self.x = 'world' 

print A.x -> hello 
print A().x -> world 

स्थिर मूल्य साझा किया जाता है http://linuxwell.com/2011/07/21/static-variables-and-methods-in-python/

:

सभी उदाहरणों के बीच

class A(): 
    x = 'hello' 

    @staticmethod 
    def talk(): 
     print A.x 

a = A() 
print a.talk() -> hello 

A.x = 'world' 
print a.talk() -> world 
आप यहाँ एक अच्छा लेख है
4

जैसा कि अन्य ने कहा है, कक्षा में एक चर के बीच अंतर और कक्षा उदाहरण पर एक चर के बीच का अंतर है। निम्नलिखित उदाहरण देखें।

>>> class A: 
...  a = [] 
... 
>>> class B: 
...  def __init__(self): 
...   self.b = [] 
... 
>>> a1 = A() 
>>> a1.a.append('hello') 
>>> a2 = A() 
>>> a2.a 
['hello'] 
>>> b1 = B() 
>>> b1.b.append('goodbye') 
>>> b2 = B() 
>>> b2.b 
[] 

tuples, तार, आदि यह अंतर नोटिस कठिन है की तरह अडिग वस्तुओं के लिए, लेकिन mutables के लिए, यह सब कुछ — परिवर्तन लागू उस वर्ग के सभी उदाहरणों के बीच साझा कर रहे हैं बदल जाता है।

ध्यान दें कि वही व्यवहार कीवर्ड तर्क डिफ़ॉल्ट के लिए होता है!

>>> class A: 
...  def __init__(self, a=[]): 
...   a.append('hello') 
...   print(a) 
... 
>>> A() 
['hello'] 
>>> A() 
['hello', 'hello'] 
>>> A() 
['hello', 'hello', 'hello'] 

>>> class B: 
...  def __init__(self, b=None): 
...   if b is None: 
...    b = [] 
...   b.append('goodbye') 
...   print(b) 
... 
>>> B() 
['goodbye'] 
>>> B() 
['goodbye'] 
>>> B() 
['goodbye'] 

यह व्यवहार कई नए पायथन प्रोग्रामर काटता है। इन भेदों को जल्दी से खोजने में आपके लिए अच्छा है!

0

आप उपयोग init आप न अपने मामले में इसका इस्तेमाल करने के लिए सिर्फ

enter code here 

class some(): 
    def main(self): 
     self.x=10 
    def mathod_a(self,foo): 
     print self.x+foo' 

और आप का उपयोग करना चाहते हैं init कोशिश आप कर सकते हैं यह

enter code here 
class some(): 
def main(self): 
    print(x) 
def init(self,x): 
    self.x=x 
    main() 
संबंधित मुद्दे