Pythonでの反射と説明器のまとめ

2144 ワード

反射
Pythonでは、一つのオブジェクトを通して、type、class、atributeまたはmethodを探し出す能力が反射となります。
関数と方法
ビルド関数:
getattr(object,name[,degault])  nameを通じてobjectの属性値を返します。属性が存在しない場合はdefaultを使って返します。defaultがない場合はAttributeErrを投げます。Nameは文字列でなければなりません。
setattr(object,name,value)  objectの属性が存在すると上書きされます。存在しません。追加されます。
hasattr(object,name)  オブジェクトにこの名前の属性があるかどうかを判断します。nameは文字列でなければなりません。
反射に関するマジック方法
同前getattr_()
一つのクラスの属性は相続関係によって探します。見つけられない場合は、__u uを実行します。getattr_()方法としては、この方法がないと、アトリエの異常表示が出てしまい、属性が見つからないということです。
検索順序は:
Instance.__dict_-->インストラクターclass_._dict_-->受け継がれた祖先類(objectまで)の_udict_-----見つけられませんでした。getattr_()
同前setattr()
インスタンス属性の増加、変更操作をブロックすることができます。設定を有効にするには、自分の操作例のdict_.
同前delattr_()
属性の削除を例で阻止することができますが、クラスを通して属性を削除することができます。
同前getattribute()
インスタンスのすべてのプロパティへのアクセスは、最初のいずれかを呼び出します。getattribute_u u方法としては、属性の検索を停止します。この方法は、値を返すか、または異常なAttributeErrを投げるべきです。
そのreturn値は属性検索の結果となります。
AttributeErrorを投げたら、直接にグウを呼び出します。グタttr表現の属性が見つからないからです。
同前grtattribute_u u方法では、この方法で無限の再帰を回避するために、彼の実装は、必要な任意の属性にアクセスするために、基本クラスの同名の方法を永遠に呼び出すべきである。getattribute_(u)self,name)この方法は一般的に使われていません。
魔術の方法
同前getattr_()
この方法は、インスタンス、インスタンスのクラス、および祖先のクラスを検索することによって属性が確認されない場合に呼び出される。
同前setattr()
アクセスインスタンスの属性を追加することにより、変更は呼び出します。
同前delattr_()
この方法はインスタンスによって属性を削除するときに呼び出します。
同前getattribute()
インスタンスのすべての属性呼び出しはこの方法から開始されます。
属性の検索順序:
実例呼び出しgetattribute()>>Instance.__dict_-->インストラクターclass_._dict_-->受け継がれた祖先類(objectまで)の_udict_-----見つけられませんでした。getattr()
説明器:
説明器の定義
pythonでは、一つのクラスが実現しました。get_,_.set_、_delete_u3つの方法のうちのいずれかは、説明器である。
叶えただけならget_u,データ記述子ではないnon-data descriptorです。
同時に実現しましたget_,_set_データディスクリプタdata descripterです。
クラスのクラス属性が説明器のインスタンスとして設定されている場合、それはownerの所有者と呼ばれる。
属性の検索順序
実例の_udict_.データ記述器は、非データ記述器より優先され、例の_u u u_よりも優先される。dict_.
ひがあるdelete_u方法には同じ効果があり、この方法があり、データ記述器でもあります。
記述器はpythonにおいて非常に広く適用されており、pythonの方法(staticmethod()およびclass method()を含む)は非データ記述器として実現されているので、再定義およびカバー方法を実現することができる。これは、単一のインスタンスが、同じクラスの他のインスタンスとは異なる挙動を取得することを可能にする。
Pythonにおけるproperty関数は、データ記述器として実現される。