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

DDD
Release: 2024-11-14 14:39:01
Original
967 people have browsed it

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__ のクラスよりは大幅に小さくなります。

結論

In summary, vanilla objects in Python cannot have attributes assigned to them because they do not possess a dict attribute. This is primarily done to conserve memory since a dict would be required for every object, regardless of whether it requires attributes. However, inherited classes can have attributes by including a dict and the slots mechanism provides an efficient alternative when a limited number of specific attributes are required.

The above is the detailed content of Why can't you assign attributes to vanilla objects in Python?. For more information, please follow other related articles on the PHP Chinese website!

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template