Python でのオブジェクトの属性の設定: 制限について
Python では、オブジェクトから継承されたクラスのインスタンスに属性を設定できます。オブジェクト クラスですが、オブジェクト クラス自体のインスタンスに直接ではありません。この区別により、次のような疑問が生じます。なぜバニラ オブジェクトに属性を割り当てることが禁止されているのですか?
オブジェクト インスタンスに辞書が存在しない
任意の属性の割り当てをサポートするには、オブジェクトには、属性を格納できる辞書として機能する dict 属性が必要です。ただし、オブジェクト クラスのインスタンスは、そのような dict__ を持ちません。 Python ですべてのオブジェクトに対して __dict を作成すると、属性を使用しないオブジェクトも含め、すべてのオブジェクトに __dict
が存在する必要があるため、かなりのメモリ オーバーヘッドが発生します。これは、pympler を使用して実証できます。プロジェクト。サイズを測定すると、辞書 (属性を保持できるオブジェクト) は 144 バイトを消費するのに対し、整数 (属性を持たないオブジェクト) は 16 バイトしか必要としないことがわかります。 __dict__ を導入すると、単純なオブジェクトでもメモリ フットプリントが大幅に増加します。継承と属性の割り当て
オブジェクト クラスを継承するクラスを作成する場合、状況が変化します。 dict
属性が新しいクラスの各インスタンスに追加され、任意の属性を持つことができるようになります。ただし、この柔軟性にはストレージのコストがかかります。たとえば、int を継承する dint というクラスを作成すると、インスタンスは 184 バイトを占有し、通常の整数の 16 バイトよりも大幅に大きくなります。この違いは、追加の dict
属性によるものです。スロット の代替
インスタンスにのみ必要なシナリオでは、少数の特定の属性に対して、Python は slots 特別な属性を提供します。 slots
を属性名を含む文字列のシーケンスとして定義することで、クラスはインスタンスが所有できる属性のセットを制限できます。このメカニズムにより、__dict__ の作成が防止され、メモリが節約されます。たとえば、int を継承し、「foobar」という単一の属性スロットを定義する fint というクラスを作成すると、インスタンスのメモリ フットプリントが 80 バイトに削減されます。これでも整数よりは大きくなりますが、__dict__ のクラスよりは大幅に小さくなります。結論
要約すると、Python のバニラ オブジェクトには dict 属性がないため、属性を割り当てることはできません。属性が必要かどうかに関係なく、すべてのオブジェクトに dict が必要となるため、これは主にメモリを節約するために行われます。ただし、継承されたクラスは dict を含めることで属性を持つことができ、slots メカニズムは、限られた数の特定の属性が必要な場合に効率的な代替手段を提供します。
以上がPython ではバニラ オブジェクトに属性を割り当てることができないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。