python描述器问题
怪我咯
怪我咯 2017-04-17 17:07:28
0
1
486
怪我咯
怪我咯

走同样的路,发现不同的人生

全員に返信(1)
Ty80

まず最初に明確にしておきます:

  • __get__ メソッドと __set__ メソッドの両方を含む記述子は、データ記述子

  • と呼ばれます。
  • __get__ メソッドのみを含む記述子は、非データ記述子

  • と呼ばれます。

次に、obj.attr を例にして、Python での属性検索の順序を明確にします。

  1. attr が dir(obj) 内の __class__、__doc__、およびその他の属性の場合、それを直接検索します。

  2. obj.__class__.__dict__ で attr という名前の
  3. データ記述子

    を探し、attr.__get__(obj, obj.__class__) を返しますが、見つかりません。 . obj の親クラスと祖先クラスのデータ記述子の検索を続けます。 obj.__dict__ を検索します。obj が共通インスタンスの場合は、直接戻ります。そうでない場合は、obj.__dict__ で記述子を検索し、見つかった場合は戻ります。 attr.__get__(

    None, obj
  4. ) が見つからない場合は、親クラスと祖先クラスで記述子
  5. を探し続けます。 obj.__class__.__dict__ で

    非データ記述子
  6. を検索し、attr.__get__(
  7. obj, obj.__class__

    ); を返します。 obj.__class__.__dict__ で共通の属性を探し、見つかった場合は直接返します。

  8. attr 属性が見つからないため、例外がスローされます

  9. 上記の検索シーケンスによれば、次のことがわかります:

    Father.name: インスタンス<-なし、所有者<-父親
  10. Kid.name:instance<-なし、所有者<-子供
f .name:インスタンス

、所有者

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート