Ändern Sie die Klassenart einer Klasse nach der eingefügten Daten
Ich möchte erstellen Sie eine Klasse in python, die sollte funktionieren wie dieser:
-
Daten zugeordnet ist, vielleicht an eine variable (zB
a = exampleclass(data)
oder nurexampleclass(data)
) -
Auf Daten eingefügt haben, sollte es automatisch bestimmen einige Eigenschaften der Daten, und wenn einige bestimmte Eigenschaften erfüllt, wird es automatisch...
-
... ändert sich die Klasse zu einer anderen Klasse
Teil 3 ist der Teil, dass ich habe problem mit. Wie kann ich wirklich Wechsel der Klasse innerhalb der Klasse? zum Beispiel:
Wenn ich zwei Klassen, die eine ist Small_Numbers
ist, und der andere Big_numbers
; jetzt will ich alle small_number
kleiner als 1000 werden übertragen in ein Big_number
und Umgekehrt, testcode:
a = Small_number(50)
type(a) # should return Small_number.
b = Small_number(234234)
type(b) # should return Big_number.
c = Big_number(2)
type(c) # should return Small_number.
Ist dies möglich?
- oh vielen Dank, ich schaute jetzt auf die änderungen, die Sie getan hat, und es ist offensichtlich, dass es nötig war
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mit einem die factory-Methode ist der übliche Weg, um dieses Problem zu lösen, besonders, da das instanziieren einer Klasse ist nicht zu unterscheiden vom aufrufen einer Funktion in Python.
Jedoch, wenn Sie wirklich wollen, können Sie zuweisen, um
self.__class__
:Dies funktioniert wie erwartet:
Wenn die Zuordnung zu
self.__class__
scheint zu seltsam, dann Sie können überschreiben die__neue__
statt. Diese Methode wird aufgerufen, bevor__init__
aufgerufen, und es kann verwendet werden, um die Klasse zu instanziieren:__slots__
. Dies ist auch erwähnt, dass unten in diesem Abschnitt in der Bedienungsanleitung.__class__
). Siehe dieser Kommentar aus der docs, und Sie denken, dass spezielle Methoden funktionieren möglicherweise nicht ordnungsgemäß, nachdem Sie das tun. Auch wenn Sie denken, Sie wissen genau, was passieren wird, du bist ok mit, dass, können Sie bekommen verschraubt mit der nächsten version von Python - nachdem alle, es gibt keine klare Versprechen von Python wie genau es wird (oder nicht) arbeiten.__class__
Zuordnung ist auch meine am wenigsten bevorzugten.__new__
braucht, um entweder zu überprüfen, dass new_cls ist keine Unterklasse von cls (if not issubclass(client_cls, cls)
), oder sonst noch etwas anderes als der Aufruf__init__
da dadurch die__init__
für die Unterklasse zweimal aufgerufen werden. Sie können dies testen, indem Sie hinzufügen einer print-Anweisung in der__init__
für jede der Unterklassen.Warum nicht über eine factory-Methode? Dieser wird entscheiden, welche Klasse zu instantiieren abhängig von den übergebenen Daten. Mit deinem Beispiel:
(SmallNumber if number < 1000 else BigNumber)(number)
.Nicht. Verwenden Sie eine factory-Funktion statt.