Pythonのオブジェクト指向|反射

 

反射されたどの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 '

おすすめ

転載: www.cnblogs.com/Summer-skr--blog/p/11801457.html