पायथन में __init__ से मान कैसे लौटाएं?


102

मेरे पास एक __init__फंक्शन वाली क्लास है ।

जब कोई ऑब्जेक्ट बनाया जाता है तो मैं इस फ़ंक्शन से पूर्णांक मान कैसे लौटा सकता हूं?

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


8
यदि आप एक त्रुटि कोड वापस करने पर विचार कर रहे थे, तो इसके बजाय एक अपवाद बढ़ाएं।
जोजी

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

जवाबों:


117

__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

24
+1: आप कुछ और नहीं लौटा सकते । इसका कोई मतलब नहीं है।
S.Lott

72
init नए बनाए गए ऑब्जेक्ट को वापस नहीं करता है - जैसा कि TypeError में देखा गया है, किसी को भी वापस करने की आवश्यकता नहीं है, है ना? नई बनाई गई वस्तु को नए द्वारा लौटाया जाता है , init बस अपनी कुछ विशेषताओं को सेट करता है। लेकिन हां, जैसा कि आपने कहा, कुछ और लौटाने के लिए init या नया बदलना वास्तव में कोई मायने नहीं रखता है।
वेरोनिका

newयहाँ कहाँ है ? है newपायथन में निहित? मैंने माना कि पायथन के शब्दार्थ जावा और दूसरी भाषाओं से भिन्न हैं जो इस शब्द का उपयोग करते हैं।
cs95

1
@ शिवा AFAIK, नई वेरोनिका का मतलब __new __ (स्व) नहीं सामान्य जावा शब्दार्थ है।
हर्ष दफ्तरी

2
सिर्फ इसलिए कि यह नहीं किया जा सकता इसका मतलब यह नहीं है कि इसका कोई मतलब नहीं है। उदाहरण के लिए, super().__init__उदाहरण के चर के माध्यम से इसे रिले किए बिना व्युत्पन्न वर्ग से डेटा पास करना अच्छा होगा ।
cz

123

आप ऐसा क्यों करना चाहते हो?

यदि आप किसी अन्य ऑब्जेक्ट को तब वापस करना चाहते हैं जब एक वर्ग कहा जाता है, तो __new__()विधि का उपयोग करें :

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

obj = MyClass()
print obj

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

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

10
यदि आप मार्क अमेरी ने क्या कहा, इसका एक उदाहरण देखना चाहते हैं, तो datetimeमानक लाइब्रेरी से मॉड्यूल के स्रोत कोड की जांच करें । यह __new__बिल्कुल इसी अंदाज में इस्तेमाल होता है।
ज़रीन

इसके अलावा अगर कोई ऐसा करना चाहता है तो उसे वस्तु से विरासत में लेना सुनिश्चित करें अन्यथा यह काम नहीं करेगा।
मिनो_ए

मैं इस तरह के विचार करता हूं, बस एक नियमित फ़ंक्शन का उपयोग करने से अधिक समझ में आता है। जावा आयाम से लोगों के लिए थोड़ा अलग हो सकता है (वर्गों में काम नहीं करता है? विधर्मी!) लेकिन इसके पायथोनिक। (इसके अलावा आप funtionName.val = के रूप में कार्यों के लिए गुण प्रदान कर सकते हैं .. जो जंगली की तरह है, लेकिन यह काम करता है)
Shayne

37

के प्रलेखन से__init__ :

कंस्ट्रक्टरों पर एक विशेष बाधा के रूप में, कोई मूल्य वापस नहीं किया जा सकता है; ऐसा करने से रन-टाइम पर टाइप-इयरर उठ जाएगा।

प्रमाण के रूप में, यह कोड:

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

f = Foo()

यह त्रुटि देता है:

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

17

प्रश्न में मामले का नमूना उपयोग निम्न प्रकार हो सकता है:

class SampleObject(object):

    def __new__(cls, item):
        if cls.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)

मेरे पास पर्याप्त प्रतिष्ठा नहीं है इसलिए मैं एक टिप्पणी नहीं लिख सकता, यह पागल है! काश, मैं इसे वेरोनिका के लिए एक टिप्पणी के रूप में पोस्ट कर सकता


3
यह एक NameError को बढ़ाएगा: selfपरिभाषित नहीं है__new__(cls, Item)
हार्ट सिम्हा

15

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

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

ओह..क्या मैं कक्षा के बाहर के सदस्य चर का उपयोग कर सकता हूं? उसके बाद मेरे मुद्दे को हल करना चाहिए .... धन्यवाद
webminal.org

@lakshmipathi, हां, उदाहरण चर इस तरह सार्वजनिक हैं।
quamrana

एक वर्ग की दीक्षा के बाद कुछ मूल्यवान प्राप्त करने के लिए एक oneliner के रूप में:f = Foo().value
JLT

@ जेएलटी हां, आप कैम हमेशा ऐसा करते हैं, लेकिन इसका मतलब यह नहीं है कि कुछ भी वापस आ गया है __init__
क़मराना

7

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


4

आप इसे एक वर्ग चर में सेट कर सकते हैं और इसे मुख्य कार्यक्रम से पढ़ सकते हैं:

class Foo:
    def __init__(self):
        #Do your stuff here
        self.returncode = 42
bar = Foo()
baz = bar.returncode

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

उपरोक्त विधि आपके परीक्षण में एक अपवाद पर एक विशिष्ट कार्रवाई को लागू करने में मदद करती है


2
super().__init__लौट रहा है None, इसलिए तुम लौट रहे हो None, जो ठीक है, लेकिन बेमानी है।
cz

2

init () रिटर्न कोई भी मान पूरी तरह से हल नहीं हुआ है

class Solve:
def __init__(self,w,d):
    self.value=w
    self.unit=d
def __str__(self):
    return str("my speed is "+str(self.value)+" "+str(self.unit))
ob=Solve(21,'kmh')
print (ob)

आउटपुट: मेरी गति 21 किमी है


-2

ठीक है, अगर आप अब वस्तु उदाहरण के बारे में परवाह नहीं करते हैं ... तो आप इसे बदल सकते हैं!

class MuaHaHa():
def __init__(self, ret):
    self=ret

print MuaHaHa('foo')=='foo'

2
यह सिर्फ selfउस निर्माणकर्ता के अंदर नाम को सौंपा गया है जो बदलता है ।
ओन्ड्रेज के।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.