2010-03-22 11 views
68

मेरे पास __init__ फ़ंक्शन वाला एक वर्ग है।पायथन में __init__ से मूल्य कैसे वापस करें?

ऑब्जेक्ट बनने पर मैं इस फ़ंक्शन से एक पूर्णांक मान कैसे वापस कर सकता हूं?

मैंने एक प्रोग्राम लिखा, जहां __init__ कमांड लाइन पार्सिंग करता है और मुझे कुछ मूल्य सेट करने की आवश्यकता है। क्या यह इसे वैश्विक चर में स्थापित करता है और इसे अन्य सदस्य कार्यों में उपयोग करता है? यदि ऐसा है तो ऐसा कैसे करें? अब तक, मैंने कक्षा के बाहर एक चर घोषित किया है। और इसे एक फ़ंक्शन सेट करना अन्य फ़ंक्शन में प्रतिबिंबित नहीं होता है ??

+6

यदि आप एक त्रुटि कोड लौटने पर विचार कर रहे थे, तो इसके बजाय एक अपवाद उठाएं। –

+0

कृपया अपनी टिप्पणी हटाएं और अपना प्रश्न अपडेट करें। आप सवाल का मालिक है। यह आपका सवाल है। कृपया सही तरीके से दिखाने के लिए प्रश्न को ठीक करें कि आपकी वास्तविक समस्या क्या है। आप '__init__' का दुरुपयोग कर रहे हैं; यदि आप वर्णन करते हैं कि आप वास्तव में क्या करने की कोशिश कर रहे हैं तो हम आपकी मदद कर सकते हैं। –

उत्तर

67

__init__ किसी को वापस करने की आवश्यकता नहीं है। आप कुछ और वापस नहीं कर सकते (या कम से कम नहीं करना चाहिए)।

जो भी आप एक आवृत्ति चर (या फ़ंक्शन) वापस करना चाहते हैं उसे बनाने का प्रयास करें।

>>> class Foo: 
...  def __init__(self): 
...   return 42 
... 
>>> foo = Foo() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: __init__() should return None 
+15

+1: आप ** ** कुछ और वापस नहीं कर सकते हैं। यह कोई समझ नहीं आता है। –

+63

__init__ नव निर्मित वस्तु को वापस नहीं करता है - जैसा कि TypeError में देखा गया है, इसे किसी को वापस करने की आवश्यकता नहीं है, है ना? नव निर्मित वस्तु __new__ द्वारा वापस आती है, __init__ बस इसके कुछ विशेषताओं को सेट करता है। लेकिन हाँ, जैसा कि आपने कहा था, __init__ को बदलना, या __new__, कुछ और वापस करने के लिए वास्तव में कोई मतलब नहीं है। – weronika

+0

यहां 'नया' कहां है? पाइथन में 'नया' अंतर्निहित है? मुझे लगता है कि पाइथन के अर्थशास्त्र जावा से अलग थे और अन्य भाषाएं जो इस शब्द का उपयोग करती हैं। –

8

__init__ कुछ भी वापस नहीं करता है और हमेशा None लौटना चाहिए।

37

documentation of __init__ से:

As a special constraint on constructors, no value may be returned; doing so will cause a TypeError to be raised at runtime.

एक सबूत के रूप में, इस कोड:

Traceback (most recent call last): 
    File "test_init.py", line 5, in <module> 
    f = Foo() 
TypeError: __init__() should return None, not 'int' 
85

क्यों आपको लगता है कि क्या करना चाहते हैं:

class Foo(object): 
    def __init__(self): 
     return 2 

f = Foo() 

इस त्रुटि देता है?

class MyClass(object): 
    def __init__(self): 
     print "never called in this case" 
    def __new__(cls): 
     return 42 

obj = MyClass() 
print obj 
+8

हाँ, __new__ कक्षा का उपयोग करते समय कक्षा के उदाहरण के अलावा कुछ और लौटने का सही तरीका है ... मैं बस सोच रहा हूं - क्या कोई कारण है कि आप वास्तव में ऐसा करना चाहते हैं? – weronika

+22

@weronika एक विचार: किसी भी परिस्थिति में जहां आप आमतौर पर एक कारखाने का उपयोग करेंगे, लेकिन आपके पास सामान्य क्लास इंस्टेंटेशन की तरह दिखने वाला इंटरफ़ेस पेश करना चाहते हैं। उदाहरण: जब आप अपनी कक्षा के '__init__' में कुछ नए वैकल्पिक पैरामीटर जोड़ते हैं, तो आप महसूस करते हैं कि वास्तव में, आप जो लचीलापन चाहते हैं उसे प्रदान करने के लिए, आपको एक वर्ग कारखाने की आवश्यकता होती है जो विशेष उप-वर्गों के उदाहरण लौटाती है। लेकिन आपकी लाइब्रेरी के उपयोगकर्ता पहले से ही आपके मौजूदा एपीआई का उपयोग कर रहे हैं। इसे संरक्षित करने के लिए, आप अपने विशेष उप-वर्गों के उदाहरणों को वापस करने के लिए '__new__' को ओवरराइड करते हैं। –

+6

यदि आप मार्क एमरी ने जो कहा है उसका एक उदाहरण देखना चाहते हैं, तो मानक लाइब्रेरी से 'डेटाटाइम' मॉड्यूल का स्रोत कोड देखें। यह वास्तव में इस फैशन में '__new__' का उपयोग करता है। – Zearin

12

__init__ विधि, अन्य तरीकों और कार्यों की तरह एक वापसी के अभाव में डिफ़ॉल्ट रूप से कोई नहीं देता है:

आप किसी अन्य वस्तु वापस जाने के लिए जब एक वर्ग कहा जाता है चाहते हैं, तो __new__() विधि का उपयोग बयान है, तो आप लिख सकते हैं यह इनमें से किसी की तरह:

class Foo: 
    def __init__(self): 
     self.value=42 

class Bar: 
    def __init__(self): 
     self.value=42 
     return None 

लेकिन, ज़ाहिर है, return None जोड़ने आप कुछ नहीं खरीदती।

मुझे यकीन है कि क्या आप के बाद कर रहे हैं नहीं कर रहा हूँ, लेकिन आप इनमें से किसी एक में रुचि हो सकती:

class Foo: 
    def __init__(self): 
     self.value=42 
    def __str__(self): 
     return str(self.value) 

f=Foo() 
print f.value 
print f 

प्रिंट:

सवाल में इस मामले की
42 
42 
+0

ओह .. क्या मैं कक्षा के सदस्य चर का उपयोग कर सकता हूं? फिर मुझे अपनी समस्या का समाधान करना चाहिए .... धन्यवाद –

+0

@ लक्ष्मीपति, हां, इस तरह के आवृत्ति चर सार्वजनिक हैं। – quamrana

+0

कक्षा के आरंभ के बाद कुछ मूल्यवान लौटने के लिए एक ऑनलाइनर के रूप में: 'f = foo()। Value' – JLT

13

नमूना उपयोग जैसा हो सकता है :

class SampleObject(object) 

    def __new__(cls,Item) 
     if self.IsValid(Item): 
      return super(SampleObject, cls).__new__(cls) 
     else: 
      return None 

    def __init__(self,Item) 
     self.InitData(Item) #large amount of data and very complex calculations 

... 

ValidObjects=[] 
for i in data: 
    Item=SampleObject(i) 
    if Item:    # in case the i data is valid for the sample object 
     ValidObjects.Append(Item) 

मैं काफी प्रतिष्ठा तो मैं एक टिप्पणी नहीं लिख सकता है की जरूरत नहीं है, यह मैं पागल है!मुझे लगता है मैं weronika

+1

यह एक नाम त्रुटि उठाएगा: 'स्वयं' को '__new __ (सीएलएस, आइटम) ' –

2

के लिए एक टिप्पणी के रूप में पोस्ट कर सकता है बस __init__

@property 
def failureException(self): 
    class MyCustomException(AssertionError): 
     def __init__(self_, *args, **kwargs): 
      *** Your code here *** 
      return super().__init__(*args, **kwargs) 

    MyCustomException.__name__ = AssertionError.__name__ 
    return MyCustomException 

उपरोक्त विधि आप अपने परीक्षण

में एक अपवाद पर एक विशिष्ट कार्रवाई को लागू करने में मदद करता में जोड़ने के लिए, आप लौट सकते हैं वर्गों चाहता था इच्छा
+0

में परिभाषित नहीं किया गया है, कृपया इस कोड पर विस्तृत करें। – nish

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