Frage Wie gebe ich einen Wert von __init__ in Python zurück?


Ich habe eine Klasse mit einem __init__ Funktion.

Wie kann ich einen Integer-Wert aus dieser Funktion zurückgeben, wenn ein Objekt erstellt wird?

Ich habe ein Programm geschrieben, wo __init__ analysiert die Befehlszeile und ich muss einen Wert gesetzt haben. Ist es OK, setze es in globale Variable und verwende es in anderen Member-Funktionen? Wenn ja, wie? Bisher habe ich eine Variable außerhalb der Klasse deklariert. und setzen Sie es eine Funktion spiegelt sich nicht in anderer Funktion?


75
2018-03-22 11:35


Ursprung


Antworten:


__init__ ist erforderlich, um keine zurückzugeben. Sie können (oder sollten Sie nicht) etwas anderes zurückgeben.

Versuchen Sie, eine Instanzvariable (oder Funktion) zurückzugeben.

>>> 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

75
2018-03-22 11:37



Warum willst du das machen?

Wenn Sie ein anderes Objekt zurückgeben möchten, wenn eine Klasse aufgerufen wird, verwenden Sie die Option __new__() Methode:

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

obj = MyClass()
print obj

89
2018-03-22 11:46



Von dem Dokumentation von __init__:

Als spezielle Einschränkung für Konstruktoren kann kein Wert zurückgegeben werden. Dadurch wird ein TypeError zur Laufzeit ausgelöst.

Als Beweis, dieser Code:

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

f = Foo()

Gibt diesen Fehler:

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

37
2018-03-22 11:41



Beispiel Die Verwendung der betreffenden Frage kann wie folgt aussehen:

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)

Ich habe nicht genug Ruf, also kann ich keinen Kommentar schreiben, es ist verrückt! Ich wünschte, ich könnte es als Kommentar veröffentlichen Weronika


13
2017-07-07 12:37



Das __init__ Methode gibt, wie andere Methoden und Funktionen, standardmäßig Keine zurück, wenn keine Rückgabeanweisung vorhanden ist. Sie können also wie folgt schreiben:

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

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

Aber, natürlich, Hinzufügen der return None kauft dir nichts.

Ich bin mir nicht sicher, was Sie suchen, aber Sie könnten sich für eines von diesen interessieren:

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

f=Foo()
print f.value
print f

Drucke:

42
42

12
2018-03-22 11:52



__init__ gibt nichts zurück und sollte immer zurückkehren None.


8
2018-03-22 11:39



Wollte nur hinzufügen, können Sie Klassen zurückgeben __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

Die obige Methode hilft Ihnen beim Implementieren einer bestimmten Aktion für eine Ausnahme in Ihrem Test


2
2018-06-02 08:52