走同样的路,发现不同的人生
まず最初に明確にしておきます:
__get__ メソッドと __set__ メソッドの両方を含む記述子は、データ記述子
__get__ メソッドのみを含む記述子は、非データ記述子
次に、obj.attr を例にして、Python での属性検索の順序を明確にします。
attr が dir(obj) 内の __class__、__doc__、およびその他の属性の場合、それを直接検索します。
を探し、attr.__get__(obj, obj.__class__) を返しますが、見つかりません。 . obj の親クラスと祖先クラスのデータ記述子の検索を続けます。 obj.__dict__ を検索します。obj が共通インスタンスの場合は、直接戻ります。そうでない場合は、obj.__dict__ で記述子を検索し、見つかった場合は戻ります。 attr.__get__(
を探し続けます。 obj.__class__.__dict__ で
); を返します。 obj.__class__.__dict__ で共通の属性を探し、見つかった場合は直接返します。
attr 属性が見つからないため、例外がスローされます
上記の検索シーケンスによれば、次のことがわかります:
、所有者
まず最初に明確にしておきます:
__get__ メソッドと __set__ メソッドの両方を含む記述子は、データ記述子
__get__ メソッドのみを含む記述子は、非データ記述子
次に、obj.attr を例にして、Python での属性検索の順序を明確にします。
attr が dir(obj) 内の __class__、__doc__、およびその他の属性の場合、それを直接検索します。
を探し、attr.__get__(obj, obj.__class__) を返しますが、見つかりません。 . obj の親クラスと祖先クラスのデータ記述子の検索を続けます。 obj.__dict__ を検索します。obj が共通インスタンスの場合は、直接戻ります。そうでない場合は、obj.__dict__ で記述子を検索し、見つかった場合は戻ります。 attr.__get__(
None, objを探し続けます。 obj.__class__.__dict__ で
非データ記述子); を返します。 obj.__class__.__dict__ で共通の属性を探し、見つかった場合は直接返します。
attr 属性が見つからないため、例外がスローされます
上記の検索シーケンスによれば、次のことがわかります:
Father.name: インスタンス<-なし、所有者<-父親、所有者