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?
__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
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
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'
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.
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
__init__
gibt nichts zurück und sollte immer None
zurückgeben.
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
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