wake-up-neo.net

Wie gibt man einen Wert aus __init__ in Python zurück?

Ich habe eine Klasse mit einer __init__-Funktion. 

Wie kann ich einen ganzzahligen Wert von dieser Funktion zurückgeben, wenn ein Objekt erstellt wird?

Ich habe ein Programm geschrieben, in dem __init__ die Befehlszeilenanalyse durchführt und ich muss einige Werte festlegen. Ist es in Ordnung, es in der globalen Variablen zu setzen und in anderen Memberfunktionen zu verwenden? Wenn ja, wie das geht? Bisher habe ich eine Variable außerhalb der Klasse deklariert. und die Einstellung einer Funktion spiegelt sich nicht in der anderen Funktion?

83
webminal.org

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

Versuchen Sie, zu machen, was immer Sie eine Instanzvariable (oder Funktion) zurückgeben möchten.

>>> 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
89
Can Berk Güder

Warum möchtest du das tun?

Wenn Sie beim Aufruf einer Klasse ein anderes Objekt zurückgeben möchten, verwenden Sie die __new__()-Methode:

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

obj = MyClass()
print obj
94
Jacek Konieczny

Aus der Dokumentation von __init__ :

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

Zum Beweis dieses Codes:

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

f = Foo()

Gibt diesen Fehler aus:

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

Die Verwendung der fraglichen Angelegenheit 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 keinen guten Ruf, deshalb kann ich keinen Kommentar schreiben, es ist verrückt! Ich wünschte, ich könnte es als Kommentar an weronika posten.

13
PMN

Wie auch andere Methoden und Funktionen gibt die __init__-Methode standardmäßig None zurück, wenn keine return-Anweisung vorhanden ist. Sie können sie also wie folgt schreiben:

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

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

Aber das Hinzufügen von return None kauft Ihnen natürlich nichts.

Ich bin nicht sicher, wonach Sie streben, aber Sie könnten an einem dieser Punkte interessiert sein:

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

f=Foo()
print f.value
print f

druckt:

42
42
12
quamrana

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

8
gruszczy

Ich wollte nur hinzufügen, Sie können Klassen in __init__ zurückgeben.

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

    MyCustomException.__= AssertionError.__name__
    return MyCustomException

Die obige Methode hilft Ihnen beim Implementieren einer bestimmten Aktion bei einer Ausnahme in Ihrem Test

2
Eugene Nosenko

Sie können es einfach auf eine Klassenvariable setzen und aus dem Hauptprogramm lesen:

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