ホームページ > バックエンド開発 > Python チュートリアル > Python における不変型と可変型: サブクラス化によって不変性が損なわれるのはいつですか?

Python における不変型と可変型: サブクラス化によって不変性が損なわれるのはいつですか?

Linda Hamilton
リリース: 2025-01-01 08:09:10
オリジナル
548 人が閲覧しました

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

不変型と可変型: より深い理解

不変型と可変型の違いは、特に混乱の原因となる可能性があります。不変型から継承する特定のクラスに。

不変型: 設計により変更されない

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート