不変型と可変型: より深い理解
不変型と可変型の違いは、特に混乱の原因となる可能性があります。不変型から継承する特定のクラスに。
不変型: 設計により変更されない
Python では、不変型は値をその場で変更できないオブジェクトです。不変オブジェクトは一度作成されると変更されません。これを変更しようとすると、新しいオブジェクトが作成されます。たとえば、float オブジェクトは不変です。これは、直接変更できないことを意味します。
不変型のサブクラス化: 可変性の幻想の作成
ただし、作成することは可能です。変更可能であるように見える不変型のサブクラス。これは、__new__ メソッドをオーバーライドすることで実現されます。たとえば、RoundFloat クラスは、値を小数点第 2 位に四捨五入する float のサブクラスです。
class RoundFloat(float): def __new__(cls, val): return float.__new__(cls, round(val, 2))
このコードは float を継承する新しいクラスを定義していますが、RoundFloat オブジェクトは不変のままです。これは、__new__ メソッドが丸められた値を持つ新しい float オブジェクトを作成するだけであり、元の float オブジェクトを変更しないためです。
可変型: 内部での変更
対照的に、可変型では値を直接変更できます。メソッドを定義するクラスは変更可能であると考えることができます。たとえば、SortedKeyDict クラスは dict から継承し、example() メソッドを定義します。
class SortedKeyDict_a(dict): def example(self): return self.keys()
このクラスでは、提供されたメソッド内で値を変更できます。ただし、SortedKeyDict クラス自体は依然として不変であることに注意することが重要です。その値は変更できますが、基になるインスタンスは同じままです。
実際の可変性を理解する
不変型と可変型の違いをよりよく理解するには、次の点を考慮してください。シナリオ。セット d を __new__ を使用して SortedKeyDict クラスに渡すとエラーが発生しますが、__new__ を使用して RoundFloat クラスに渡すとエラーは発生しません。
d = (('zheng-cai', 67), ('hui-jun', 68),('xin-yi', 2)) SortedKeyDict.__new__(cls, d) # Error raised RoundFloat.__new__(cls, 12) # No error
これは、SortedKeyDict が変更可能で RoundFloat が不変更であることを示しています。 SortedKeyDict は変更可能であるため、メソッド内の適切な場所で変更できます。対照的に、RoundFloat は不変であるため、__new__ に渡しても元のオブジェクトは変更されません。
以上がPython における不変型と可変型: サブクラス化によって不変性が損なわれるのはいつですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。