Unveränderliche vs. veränderliche Typen: Ein tieferes Verständnis
Der Unterschied zwischen unveränderlichen und veränderlichen Typen kann zu Verwirrung führen, insbesondere wenn es darum geht an bestimmte Klassen, die von unveränderlichen Typen erben.
Unveränderliche Typen: Unveränderlich von Design
In Python sind unveränderliche Typen Objekte, deren Wert nicht direkt geändert werden kann. Einmal erstellt, bleibt ein unveränderliches Objekt unverändert; Jeder Versuch, es zu ändern, führt zu einem neuen Objekt. Beispielsweise ist das Float-Objekt unveränderlich, was bedeutet, dass es nicht direkt geändert werden kann.
Unterklassen unveränderlicher Typen: Die Illusion der Veränderlichkeit erzeugen
Es ist jedoch möglich, etwas zu erstellen Unterklassen unveränderlicher Typen, die veränderbar zu sein scheinen. Dies wird durch Überschreiben der __new__-Methode erreicht. Beispielsweise ist die RoundFloat-Klasse eine Unterklasse von Float, die ihren Wert auf zwei Dezimalstellen rundet:
class RoundFloat(float): def __new__(cls, val): return float.__new__(cls, round(val, 2))
Während dieser Code eine neue Klasse definiert, die von Float erbt, bleibt das RoundFloat-Objekt unveränderlich. Dies liegt daran, dass die Methode __new__ einfach ein neues Float-Objekt mit dem gerundeten Wert erstellt und das ursprüngliche Float-Objekt nicht verändert.
Veränderliche Typen: Änderungen im Inneren
Im Gegensatz dazu ermöglichen veränderbare Typen die direkte Änderung ihrer Werte. Klassen, die Methoden definieren, können als veränderbar betrachtet werden. Beispielsweise erbt die SortedKeyDict-Klasse von dict und definiert eine example()-Methode:
class SortedKeyDict_a(dict): def example(self): return self.keys()
Diese Klasse ermöglicht die Änderung ihrer Werte innerhalb der bereitgestellten Methoden. Es ist jedoch wichtig zu beachten, dass die SortedKeyDict-Klasse selbst immer noch unveränderlich ist. Seine Werte können geändert werden, aber die zugrunde liegende Instanz bleibt dieselbe.
Veränderlichkeit in der Praxis verstehen
Um den Unterschied zwischen unveränderlichen und veränderlichen Typen besser zu verstehen, beachten Sie Folgendes Szenario. Die Übergabe der Menge d an die Klasse SortedKeyDict mit __new__ löst einen Fehler aus, die Übergabe an die Klasse RoundFloat mit __new__ jedoch nicht.
d = (('zheng-cai', 67), ('hui-jun', 68),('xin-yi', 2)) SortedKeyDict.__new__(cls, d) # Error raised RoundFloat.__new__(cls, 12) # No error
Dies zeigt, dass SortedKeyDict veränderbar und RoundFloat unveränderlich ist. Da SortedKeyDict veränderbar ist, kann es innerhalb seiner Methoden direkt geändert werden. Im Gegensatz dazu ist RoundFloat unveränderlich, sodass die Übergabe an __new__ das ursprüngliche Objekt nicht verändert.
Das obige ist der detaillierte Inhalt vonUnveränderliche vs. veränderliche Typen in Python: Wann unterbricht die Unterklassenerstellung die Unveränderlichkeit?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!