最近、私はofficial HOW-TO about Python descriptorsを読んでいます。実際には、これはRaymond Hettingerによって書かれたan essayです。しかし、それを数回読んだ後、私はまだそれのいくつかの部分について混乱しています。私はいくつかの段落を引用し、続いて私の混乱と質問をします。Python記述子と<Descriptor HowToガイド>についての悩み
インスタンスの辞書はデータ記述子と同じ名前のエントリがある場合は、データ記述子が優先されます。インスタンスの辞書に、非データ記述子と同じ名前のエントリがある場合は、辞書エントリが優先されます。
- これはクラスと同じですか?辞書のデータ/非データ記述子と同じ名前のエントリがある場合、クラスの優先順位チェーンは何ですか?オブジェクトの場合
は、機械は、
type(b).__dict__['x'].__get__(b, type(b))
にb.x
を変換object.__getattribute__()
です。インプリメンテーションは、データ記述子がインスタンス変数よりも優先され、インスタンス変数が非データ記述子よりも優先される優先順位チェーンによって処理され、指定されている場合は最も低い優先順位が__getattr__()
に割り当てられます。クラスの場合、機械は
type.__getattribute__()
にあり、B.x
をB.__dict__['x'].__get__(None, B)
に変換します。
- 上記の二つの段落は、ディスクリプタの属性アクセス時に自動的に起動されるプロセスを教えてください。インスタンス(
b.x
)とクラス(B.x
)によってアクセスされる属性の違いをリストします。しかし、ここで私の混乱は、次のとおりです。クラスの属性またはインスタンスがディスクリプタでない場合- 、変換は(すなわち、
B.__dict__['x'].__get__(None, B)
にtype(b).__dict__['x'].__get__(b, type(b))
とB.x
にb.x
を変換)まだ進むのだろうか?このクラスまたはインスタンスの属性をdictに直接返すのは簡単ですか? - インスタンスの辞書に、非データ記述子と同じ名前のエントリがある場合、最初の引用符の優先順位ルールに従って、辞書エントリが優先されます。この時点で変換はまだ進行しますか?または、のdictの値を返すだけですか?
- 、変換は(すなわち、
非データディスクリプタメソッドに結合機能の通常パターンのバリエーションのための簡単な機構を提供します。
- 関数/メソッドのみがを得てもよいが、をを設定することができないので、選ばれた非データディスクリプタですか?
- 関数をメソッドにバインドするための基本的なメカニズムは何ですか?クラス辞書はメソッドを関数として格納するので、クラスとそのインスタンスをそれぞれ使用して同じメソッドを呼び出すと、最初の引数がのいずれかであるかどうかをどのように知ることができますか??属性としてアクセスしたとき、彼らは法に変換することができるように
機能
__get__()
方法を持っています。非データ記述子は、obj.f(*args)
コールをf(obj, *args)
に変換します。klass.f(*args)
を呼び出すとf(* args)になります。
- どのように非データディスクリプタは
f(obj, *args)
にobj.f(*args)
コールを変換することができますか? - 非データ記述子を
klass.f(*args)
に変換すると、どのようにしてf(*args)
にコールできますか? - 上記の2つの変換の根底にあるメカニズムは何ですか?クラスとインスタンスの間に違いがあるのはなぜですか?
- 上記の状況で
__get__()
メソッドの役割は何を果たしますか?