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 중국어 웹사이트의 기타 관련 기사를 참조하세요!