13 September 2014
ディスクリプタとは?

ディスクリプタは、Pythonの至る所で使われているプロトコル
プロパティ、メソッド、静的メソッド、クラスメソッド、super()などの
背後にある機構として用いられている

  • __get__,__set__,__delete__を定義したらディスクリプタになる
ディスクリプタの分類
  • データディスクリプタ
  • 非データディスクリプタ
  • 読み取り専用のデータディスクリプタ
    __set__が呼び出された時に
    AttributeErrorが送出されるものを指す

これらの分類は、属性アクセスの優先順位に関係する

プロパティとの違い
  • 特定クラスから独立して定義される
  • 他のクラスの属性アクセスをカスタマイズする為に使われる
  • ディスクリプタは汎用性が高い
Python2/3による違い

属性アクセスのカスタマイズに影響?
__getattribute__をオーバライドすると
あるクラスの全ての属性をカスタマイズできる?
ディスクリプタを使うと、特定の属性アクセスをカスタマイズできる

object, type, super(__getattribute__が実装されている)
データディスクリプタの呼び出しがされた時の処理?

メソッドの第一引数がselfなのは何故?

ディスクリプタが関係している
ディスクリプタの働きによって単なる関数呼び出しに置き換えられるから?

Python2/3の実装の違い
  • Python3にはUnboundMethodは存在しない

親クラスよりも上のメソッドを呼び出すという事
reifyは非データディスクリプタであり
同じ名前でインスタンスの属性辞書にセットしているので
次回からその値が優先される???