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

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











LinuxターミナルでPythonバージョンを表示する際の許可の問題の解決策PythonターミナルでPythonバージョンを表示しようとするとき、Pythonを入力してください...

fiddlereveryversings for the-middleの測定値を使用するときに検出されないようにする方法

PythonのPandasライブラリを使用する場合、異なる構造を持つ2つのデータフレーム間で列全体をコピーする方法は一般的な問題です。 2つのデータがあるとします...

UvicornはどのようにしてHTTPリクエストを継続的に聞きますか? Uvicornは、ASGIに基づく軽量のWebサーバーです。そのコア機能の1つは、HTTPリクエストを聞いて続行することです...

10時間以内にコンピューター初心者プログラミングの基本を教える方法は?コンピューター初心者にプログラミングの知識を教えるのに10時間しかない場合、何を教えることを選びますか...

Investing.comの反クラウリング戦略を理解する多くの人々は、Investing.com(https://cn.investing.com/news/latest-news)からのニュースデータをクロールしようとします。
