2017-10-13 17 views
5

मैं प्रोग्रामिंग के लिए बहुत नया हूं। मैंने बस कुछ हफ्तों के लिए शुरू किया। मैंने कक्षा के बारे में पढ़ने में घंटों बिताए लेकिन मैं अभी भी उलझन में हूं। मेरे पास एक विशिष्ट सवाल है।पायथन __init__ बनाम वर्ग गुण

कक्षा गुणों का उपयोग कब और प्रारंभकर्ता (__init__) का उपयोग करने पर मुझे उलझन में है।

मैं समझता हूं कि __init__ का उपयोग करते समय, मैं तुरंत कोई मान निर्दिष्ट नहीं करता हूं, लेकिन जब मैं उस वर्ग का उपयोग कर ऑब्जेक्ट बनाता हूं तो केवल मूल्य असाइन करने की आवश्यकता होती है। और वर्ग गुण स्वचालित रूप से उस वर्ग के तहत बनाए गए ऑब्जेक्ट के निहित होते हैं।

लेकिन व्यावहारिक उपयोग की अवधि में, क्या उन्होंने वही काम पूरा किया? क्या वे एक ही काम करने के लिए सिर्फ दो अलग-अलग तरीके हैं? या __init__ ऐसा कुछ करता है जो क्लास गुण नहीं कर सकता है?

मैं इन कोडों के साथ कुछ परीक्षण चला गया, परिणाम समान हैं। मैं कब उपयोग कर रहा हूं उलझन में हूँ। मेरे लिए कक्षा विशेषता उपयोग करने के लिए और अधिक सुविधाजनक लग रहा है।

#use class attributes for class Numbers_1 
class Numbers_1: 

    one = 1 
    two = 2 
    three = 3 
    six = two * three 

def multiply(self): 
    return self.six * self.two * self.three 

#use initializer for class Numbers_2  
class Numbers_2: 

def __init__(self, num10, num20, num30, num600): 
    self.num10 = num10 
    self.num20 = num20 
    self.num30 = num30 
    self.num600 = num600 

def multiply(self): 
    return self.num600 * self.num20 * self.num30 

#Now I run some test to compare the two classes... 
x = Numbers_1() 
y = Numbers_2(10, 20, 30, 20*30) 

print(x.one)  #print 1 
print(y.num10) #print 10 

print(x.six)  #print 6 
print(y.num600) #print 600 

#assign attributes to each objects 
x.eighteen = x.six * x.three 
y.num18000 = y.num600 * y.num30 

print(x.eighteen) #print 18 
print(y.num18000) #print 18000 

#try printing methods in each object 
print(x.multiply()) #print 36 
print(y.multiply()) #print 360000 

#try reassign values to attributes in each object 
x.one = 100 
y.num10 = 1000 

print(x.one)  #prints 100 
print(y.num10) #prints 1000 
+0

यह देखने के लिए एक बात यह है कि ** example.one = 2 ** उस उदाहरण के नामस्थान में आपके प्रथम श्रेणी के पुनर्मिलन 'एक' के उदाहरण पर, इसलिए यह साझा परिवर्तनीय बात _seems_ गलत है। चीजों की बेहतर समझ प्राप्त करने के लिए जोड़ना जैसे परिवर्तनीय चर के साथ खेलें। उदाहरण के लिए कक्षा स्तर और ओवरराइडिंग में घोषित करना अपरिवर्तनीय चर के लिए डिफ़ॉल्ट मान रखने का एक शानदार तरीका है। –

+0

मेरा मतलब है "ऊपर एक वर्ग स्तर सूची चर में संलग्न"। –

उत्तर

3

आपको सबकुछ ठीक मिला - सिवाय इसके कि वर्ग गुण पाइथन में स्थैतिक चर की तरह काम करते हैं।

नोट करें कि क्लास स्कोप में सबकुछ पाइथन दुभाषिया द्वारा पार्सिंग पर तुरंत चलाया जाता है

# file1.py 
def foo(): 
    print("hello world") 

class Person: 
    first_name = foo() 
    last_name = None 

    def __init__(self): 
     last_name = "augustus" 
     print("good night") 

# file2.py 
import file1 
>>> "hello world" 
x = Person() 
>>> "good night" 
1

कक्षा विशेषताएँ वस्तु विशिष्ट नहीं हैं। उदाहरण के लिए:

x = Numbers_1() 
y = Numbers_1() 

उपर्युक्त में, एक्स और वाई के समान वर्ग गुण होंगे।

इसके विपरीत, init फ़ंक्शन ऑब्जेक्ट विशेषताओं को परिभाषित करता है। उदाहरण के लिए:

s = Numbers_2(10, 20, 30, 20*30) 
t = Numbers_2(11, 21, 31, 21*31) 

एस और टी में अब विभिन्न ऑब्जेक्ट विशेषताएँ हैं।

2

के अंतर को समझने के लिए, आपको कक्षाएं और उदाहरणों उन वर्गों के के बीच अंतर पर विचार करने की जरूरत है।

कक्षा गुण उस कक्षा के प्रत्येक ऑब्जेक्ट पर लागू होते हैं। उन्हें संशोधित करना उस वर्ग के सभी उदाहरणों को संशोधित करता है। संशोधित आवृत्ति गुण केवल विशिष्ट वस्तु को छेड़छाड़ करने में संशोधित करता है।

उदाहरण के लिए:

class Foo: 
    class_var = 'bar' 
    def __init__(self): 
     self.instance_var = 'baz' 
foo1 = Foo() 
foo2 = Foo() 

print(foo1.class_var, foo2.class_var) 
print(foo1.instance_var, foo2.instance_var) 

Foo.class_var = 'quux' 
Foo.instance_var = "this doesn't work" 
foo1.instance_var = 'this does' 


print(foo1.class_var, foo2.class_var) 
print(foo1.instance_var, foo2.instance_var) 

प्रिंट

bar bar 
baz baz 
quux quux 
this does baz 

तो, Foo.class_var संशोधित Foo की class_varके लिए सभी मौजूदा उदाहरणों की जगह है, जबकि संशोधित Foo.instance_var कुछ नहीं करता है। ऑब्जेक्टFoo पर काम करता है, लेकिन केवल उस विशिष्ट उदाहरण के लिए - अन्य उदाहरण अपरिवर्तित हैं।

2

आप एक से अधिक वस्तुओं को बनाने हैं, तो आप अंतर

class Numbers_1: 

    one = 1 
    two = 2 
    six = one * two 

    def __init__(self, o, t): 
    self.o = o 
    self.t = t 

    def mul(self): 
    return self.o * self.t 

o1 = Numbers_1(1, 2) 
o2 = Numbers_1(10, 20) 
o3 = Numbers_1(20, 30) 

print(o1.six) # 2 
print(o2.six) # 2 
print(o3.six) # 2 

print(o1.mul()) # 2 
print(o2.mul()) # 200 
print(o3.mul()) # 600 

चर वर्ग चर जैसे एक, छह कहा जाता है के लिए देख सकते हैं।

कक्षा चर एक ही कक्षा के साथ बनाई गई वस्तुओं द्वारा साझा किए जाते हैं।

संबंधित मुद्दे