オブジェクトの属性を取得したいとします: smth = object.attr
. また、属性がどのオブジェクトにあるかが既にわかっているとします。それを A というクラスとします。
私の知る限り、属性取得手順は次のようになります。
attr = A.__dict__['attr'] # 1
if hasattr(attr, '__get__'): # 2
return attr.__get__(None, A)
else:
return attr
- クラス A の属性ディクショナリで記述子を見つけます。
- 属性のゲッターが存在する場合は、その出力を返します。それ以外の場合は、属性自体を返します。
ここに問題があります。属性がゲッターを持つ記述子であるとします。その場合、 を解決するobject.descriptor
にdescriptor.__get__
は、非データ記述子 (関数) を解決する必要があり、これも解決する必要があります。この再帰の終わりはどこですか?