Wie kann ich die Abbruch-Objekt-Instanz-Erstellung in Python?
Ich möchte die Einrichtung einer Klasse, die bricht während der Instanz zu erstellen, basierend auf dem Wert der übergebene argument in die Klasse. Ich habe versucht, ein paar Dinge, einer von Ihnen wird das ein Fehler in der __new__
Methode:
class a():
def __new__(cls, x):
if x == True:
return cls
else:
raise ValueError
Dies ist, was ich hoffte passieren würde:
>>obj1 = a(True)
>>obj2 = a(False)
ValueError Traceback (most recent call last)
obj1
existiert, aber obj2
nicht.
Irgendwelche Ideen?
- sollten Sie nicht überschreiben
__init__(self, ...)
statt? - b. Es ist nicht als semantische, wenn dann die Absicht ist, zu stoppen-Objekt erstellen. Es hat aber funktioniert.
- Warum würde das auslösen einer exception im
__new__
vorzuziehen, um zu erheben, in__init__
. Das Ergebnis scheint das gleiche zu mir und__init__
ist, wo alle anderen code für die Initialisierung geht. Warum sollte dies nicht gehen, gibt es so gut ist? - denn es ist nicht initilization - code. Es ist bedingte Bau - code. Es scheint, wie
__init__
sollte nur eine Ausnahme werfen, wenn es in Schieflage Gerät initialisieren der Instanz. Hier ist es eine explizite test, der gemacht wird. Ich bin wahrscheinlich nur Wortklauberei, wenn. Ich würde sagen, dass, wenn Sie wollen, es zu tun in der Initialisierung, versuchen Sie einfach, zu verwenden, wasx
ist und lassen Sie, dass Sie eine Ausnahme auslösen, oder gehen Sie durch. - Ich glaube wirklich, dass die Ratschläge, die man möchte zu geben, ist im Allgemeinen zu behandeln
__init__
als Konstruktor. Wenn der Bau des Objektes muss abgebrochen werden, aus irgendeinem Grund, es funktioniert genauso gut für das auslösen einer Ausnahme. Überschreiben__new__
ist sehr selten erforderlich und für den täglichen normalen Klassen, die ich denke, es sollte vermieden werden. Dabei hält die Klasse Umsetzung einfach.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beim überschreiben
__new__
, vergessen Sie nicht, rufen Sie super!Rücksendung der Klasse tut nichts, wenn es war Ihren job eine Instanz zu schaffen. Dies ist, was die super-Klasse
__new__
Methode macht, also nutzen Sie es.Nur das auslösen einer exception bei der Initialisierung:
__init__
ist nicht der Konstruktor, es ist die Initialisierung. Denken Sie an__new__