o.attr = 'hello' のようにバニラ オブジェクト インスタンスに属性を割り当てようとすると、AttributeError が発生します、オブジェクトに指定された属性がないことを示します。ただし、これは、s.attr = 'hello' のような属性を割り当てることができる Sub などのオブジェクトを継承するクラスでは問題になりません。なぜそうなるのかを知るには、Python の内部インフラストラクチャを理解する必要があります。
動的な属性割り当てをサポートするには、オブジェクトに __dict__ が必要です。これは、任意の属性を格納する辞書として機能します。保管することができます。 __dict__ がないと、新しい属性に使用できるストレージがありません。
オブジェクトのインスタンスには __dict__ がありません。 dict も object から継承するため、オブジェクト定義にこれを含めると、循環依存の問題が発生します。さらに、すべてのオブジェクトに __dict__ を割り当てると、動的な属性の割り当てを必要としないオブジェクトに不必要なメモリ オーバーヘッドが発生します。
オブジェクトを継承するクラスが作成されるとき、状況は変わります。クラス インスタンスの作成により、__dict__ の割り当てがトリガーされます。これにより、オブジェクトのサブクラスが動的な属性割り当て機能を持つことができますが、柔軟性の追加に伴うメモリ コストが発生します。
Python は最適化を提供します。 __slots__ という手法を使用して、オブジェクトに割り当てることができる属性を制限します。 __slots__ 属性で文字列名のシーケンスを指定することにより、クラスは Python に __dict__ を作成せず、代わりに指定された属性スロットのみを割り当てるように指示します。このアプローチはメモリ オーバーヘッドを削減し、オブジェクトに固定の属性セットがある状況で役立ちます。
要約すると、オブジェクト インスタンスに属性を割り当てることができないのは、__dict__ がないことが原因であり、これによりメモリ オーバーヘッドが発生します。動的な属性割り当て機能を持たないオブジェクトの場合。ただし、クラス インスタンスは __dict__ を所有し、属性を動的に割り当てることができます。 __slots__ 属性は、属性の割り当てを固定セットに制限することでメモリ最適化オプションを提供します。
以上がPython でバニラ オブジェクト インスタンスの属性を変更できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。