Python での不変オブジェクトの作成
Python での不変オブジェクトの作成には課題が生じる可能性があります。初期化中に属性を設定できないため、setattr をオーバーライドするだけでは不十分です。一般的に使用される解決策は、以下に示すように、タプルをサブクラス化することです:
<code class="python">class Immutable(tuple): def __new__(cls, a, b): return tuple.__new__(cls, (a, b)) @property def a(self): return self[0] @property def b(self): return self[1] def __str__(self): return "<Immutable {0}, {1}>".format(self.a, self.b) def __setattr__(self, *ignored): raise NotImplementedError def __delattr__(self, *ignored): raise NotImplementedError</code>
ただし、このアプローチでは、self[0] および self[1] を介して a および b 属性へのアクセスが許可されるため、不便な場合があります。 .
純粋な Python の不変性を実現するには、別の代替手段が存在します。
<code class="python">Immutable = collections.namedtuple("Immutable", ["a", "b"])</code>
このメソッドは、スロット を利用し、タプルから継承して、目的の動作を持つ型を生成します。これは、pickle および copy との互換性という利点を提供しますが、[0] および [1] を介して属性にアクセスすることも可能です。
以上がPython で真の不変性を実現するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。