反射されたどの1
主反射プログラムができ指し、アクセス、変更、および検出独自の能力状態または挙動(イントロスペクション)。
2. Pythonの反射オブジェクト指向:文字列によって操作オブジェクト関連の特性。すべてが(リフレクションを使用することができる)Pythonでオブジェクトであります
四は組み込み関数:
hasattr(OBJ、ATTR):
このメソッドが使用されているがどうかチェックするためにOBJのattrという名前の属性の値を、それがブール値を返します。
GETATTR(OBJ、ATTR):
このメソッドを呼び出すと返す値attrの命名OBJ プロパティの値を attrは「バー」、obj.barリターンであれば、例えば、。
SETATTR(OBJ、ATTR、ヴァル)
: 値がATTRという名前のOBJのこのメソッドを呼び出します割り当てられた属性のvalにします。例えば、attrが=ヴァルobj.barに対応する「バー」である場合
delattr(OBJ、名)
機能削除する OBJ文字列で指定された属性。delattr(X、 'foobarに') =デルx.foobar
インスタンス化オブジェクトリフレクタ
クラスFooの: F = ' 静的クラス変数' DEF __init__ (セルフ、名前、年齢): self.name = 名前 self.age = 年齢 DEF say_hi(セルフ): 印刷(' こんにちは、S%'%self.name) OBJ =はFoo(' トニー'、18がある) #それが財産含まれているかどうかを検出する 印刷(はhasattr(OBJ、' 名前')) #真 印刷(はhasattr(OBJ、「say_hiを')) #真 #のGETプロパティ 印刷(GETATTR(OBJ、' 名前')) #トニーの 印刷(GETATTR(OBJ、' say_hi ")) #<方法Foo.say_hiバインドの<__ main__.FooオブジェクトAT 0x00000219B4CF6688 >> 印刷(GETATTR(OBJ、' AAAAAAAA '、' ああは存在しません')) #は、あなたが設定されていない場合は、ああは存在しません。エラーがされます 。#プロパティ設定 SETATTR(OBJ、' ジョン' 、TRUE) SETATTR(OBJを、"SHOW_NAME ' ラムダ自己:self.name + ' 定規' ) を印刷。(OBJ __dict__) #{'名前':'トニー''年齢:ジョンの18は、ある' ':真、' SHOW_NAME「:<関数<ラムダ> 0x000001E56C6AC048 AT>} 印刷(obj.show_name(OBJ)) #トニー6月 #が削除されたプロパティ delattr(OBJ、' 年齢' ) delattr(OBJ、' SHOW_NAME ' ) #delattr(OBJ、 'show_name111')#が存在しない、エラー 印刷(OBJ。__dict__) # { '名前': 'トニー'、 'ジョン:真}
クラスのリフレクション
クラスはFoo(オブジェクト): staticField = " オールド・ボーイ" DEF __init__ (セルフ): self.name = ' wupeiqi ' DEF FUNC(セルフ): リターン ' FUNC ' @staticmethod DEFのバー(): リターン ' バー' 印刷(GETATTR( FOO、「staticField 」)) #の2番目のパラメータは静的プロパティ、オブジェクトのプロパティ、メソッド、すべての単一引用符「であるかどうかを注意」 プリント(geattr(FOO、「FUNC 」)) 印刷(GETATTR(フー、' バー'))
反射し、現在のモジュール
インポート時 #PYファイルがモジュールである time.time() IFはhasattr(時間、' 時間' :) 印刷(time.time) 印刷(GETATTR(時間、' 時間' )()) '' ' を行い出力: <時間に機能を内蔵> 1569572942.545881 「」 '
インポートSYS DEF S1(): プリント(' S1 ' ) DEF S2(): プリント(' S2 ' ) current_module = sys.modules [ __name__ 】 プリント(current_module) プリント(はhasattr(current_module、' S1 ' )) プリント(GETATTR (current_module、' S2 ' )) ''」 执行输出: <モジュール'__main__ C'から':/Users/Administrator/Desktop/temp/test.py'> 真 <0x0000026BFDF98048での関数S2> 「」」
他のモジュールの反射光
"" " プログラムカテゴリ: module.py test.pyを " "" #モジュールmodule.pyの内のコード クラスA: 名 = " Module1の" DEF FUNC(): 印刷(' I FUNCモジュールのモジュール' ) #のテスト。コード内のPY インポートModule1の #1 :方法A CLAS = GETATTR(Module1を、' ' ) プリント(clas.name) #Module1を#方法2:プリント(GETATTR(module.A、' 名称')) #モジュール GETATTR(module.A、' FUNC ')() #私はFUNCモジュールモジュール
あなたはファイル名のuserinfoがあると、あなたが名前を変更する必要があります
#最初の:従来の接近 インポートOSの os.rename(' のUserInfo '、' ユーザ' ) #第二:反射 インポートOSの GETATTR(OS、' リネーム')(' のUserInfo '、' ユーザ') #GETATTR( OS、 '名前の変更は、')os.renameに対応します
要約:
使用して1クラス名、クラスの名前空間 GETATTR(クラス名、「名」)
2は、オブジェクトのメソッドとプロパティを使用して対象とすることができる GETATTR(オブジェクト名、「名称」)
モジュール内のそれらの位置から3.自分の名前を SYSインポート
のgetattr(sys.modules [ '__ MAIN__'] 、名称)
4.モジュールのモジュール名 インポートモジュール
GETATTR(モジュール名、「名称」)
輸入OS; GETATTR(OS、' 名前の変更')(' ユーザー'、' USER_INFO ')