2017-10-05 18 views
0

カスタムPythonのクラスインスタンスの__dict__属性が descriptorであることに注意してくださいカスタムPythonクラスインスタンスの `__dict__`属性がインスタンスの実際の属性ではなく、クラスの記述子となるのはなぜですか?

https://stackoverflow.com/a/44880260/156458から。 インスタンス自体には属性がありません。 が提供するクラスです( type(instance).__dict__['__dict__'].__get__(instance)が返されます)。 object.__dict__が存在する可能性がありますが、 object.__dict__['__dict__']は です。

カスタムPythonクラスインスタンスの__dict__属性がインスタンスの実際の属性ではなく、そのクラスの記述子であるのはなぜですか?

+1

クラスのすべてのインスタンスは同じ記述子を持つため、すべてのインスタンスでそれを複製する必要はありません。 – Barmar

+0

@Barmarであるがクラスのインスタンスが異なるとインスタンスの属性が異なるため、異なるインスタンス属性を格納するために独自の '__dict__'が必要です。正しい? – Tim

答えて

5

あなたが__dict__を見つけることができる前に、__dict__エントリとしてそれを実装する__dict__を見つけるためにあなたを必要とするので、それは__dict__を記述しなければならと言うことは魅力的だが、他のを見たときに、Pythonはすでに__dict__を見つけるために、通常の属性のルックアップをバイパスそれは最初に聞こえるほど魅力的ではありません。ディスクリプタが__dict__'__dict__'のキーで置き換えられた場合でも、__dict__が見つかる可能性があります。

は、すべての__dict__'__dict__'のキーを持っていないことにより、いくつかのスペースの節約をありますが、それは大きな理由ではありません。 '__dict__'キーを設定しなくても時間を節約でき、循環参照を作成しないことで時間と空間を節約することができます。これらの利点はすべて素晴らしいですが、次のものよりもおそらく小さくなります。

__dict__をディスクリプタにすることは、オブジェクトの__dict__を再割り当てまたは削除しようとする試みを処理する大きな問題です。 __dict__の属性ルックアップが__dict__キーを通過した場合、someobj.__dict__を再割り当てすると、実際にdict Pythonが何を検索してsomeobjの属性を検索するかを変えずにdictキーを再割り当てします。 __dict__はディスクリプタである必要があります。したがって、Pythonがオブジェクトのdictを見つけるために実際のCレベルの構造体スロットと同期しています。

+0

ありがとうございます。 "Pythonはすでに' __dict__'を見つけるために通常の属性検索をバイパスしていますか? – Tim

+0

@Tim: 'someobj.foo'を調べると、Pythonは型の型を使ってインスタンスdictを見つけます(https://github.com/python/cpython/blob/v3.6.3/Objects/object.c#L1067)通常の属性検索によって 'someobj .__ dict__'を調べるのではなく、Cレベルの' tp_dictoffset'を実行します。 – user2357112

+0

ありがとうございます。 (1) '__dict__'のルックアップ処理は、' __name__、__class__、__new__、__init__、__str__、__repr__'のように、名前の先頭と末尾の両方が2つのアンダースコアで始まる特別な属性にも適用されますか? (2)[名前が2つのアンダースコアで始まり、終わりの両方を持つ自己定義属性を検索します(例:'__madeupAttribute__')はこれらの特殊属性のルックアップと同じですか?](https://stackoverflow.com/q/46594480) – Tim

1

インスタンスがカスタム属性を持つことができる属性なので、これは、インスタンスの新しいカスタム属性が保存される場所です。循環参照を避けるためにはいくつかの魔法が必要です(インスタンス上で__dict__を検索して__dict__を見つけることは望ましくありません)。クラス記述子は、インスタンスの属性検索のためのこの種の魔法を持つ2つのPythonのメカニズムの1つです。

関連する問題