ホームページ > バックエンド開発 > Python チュートリアル > Python ではバニラ オブジェクトに属性を割り当てることができないのはなぜですか?

Python ではバニラ オブジェクトに属性を割り当てることができないのはなぜですか?

DDD
リリース: 2024-11-14 14:39:01
オリジナル
1028 人が閲覧しました

Why can't you assign attributes to vanilla objects in Python?

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

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