Heim > Backend-Entwicklung > Python-Tutorial > Unveränderliche vs. veränderliche Typen in Python: Wann unterbricht die Unterklassenerstellung die Unveränderlichkeit?

Unveränderliche vs. veränderliche Typen in Python: Wann unterbricht die Unterklassenerstellung die Unveränderlichkeit?

Linda Hamilton
Freigeben: 2025-01-01 08:09:10
Original
514 Leute haben es durchsucht

Immutable vs. Mutable Types in Python: When Does Subclassing Break Immutability?

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))
Nach dem Login kopieren

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()
Nach dem Login kopieren

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
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage