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, was x 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.
InformationsquelleAutor moorepants | 2010-10-05
Schreibe einen Kommentar