一、でisinstance(OBJ、CLS)和issubclass(サブ、スーパー)
1.1でisinstance(OBJ、CLS)
objがクラスCLSの対象であるか否かでisinstance(OBJ、CLS)チェック
Fooクラス(オブジェクト): パス OBJ =フー() プリント(でisinstance(OBJ、フー))#True
1.2、issubclass(サブ、スーパー)
issubclass(サブ、スーパー)は、サブクラスをチェックするかどうかは、派生クラスのスーパークラスであります
Fooクラス(オブジェクト): パス・ クラスのバー(フー): パス・ プリント(issubclass(バー、フー))#True
第二に、反射
4つのファンクションは、クラスとオブジェクトのための自己検査を達成することができます(すべてが対象で、クラス自体が目的です)
2.1はhasattr(オブジェクト名)
プロパティに対応するか、オブジェクト名の文字列を決定する方法はありません
2.2、GETATTR(オブジェクト、名前、デフォルト=なし)
GETATTRの#知られている特殊なケース:デフ(オブジェクト、名前、デフォルト=なし)GETATTR "」" >値- GETATTR(オブジェクト、名[、デフォルト])が GETATTR(X、 'Y');オブジェクトから名前付き属性を取得します。 xyがすることと等価である 属性がいない場合、デフォルト引数が指定されている場合、それが返されます 。存在し、それなしで、例外が、その場合に発生します 「「」 合格 GETATTR(オブジェクト、名前、デフォルト=なし)
2.3、SETATTR(X、Y、V)
プロパティの設定
DEF SETATTR(X、Y、V):#実際の署名不明。__doc__から復元 "" " 指定された値に指定されたオブジェクトの名前付き属性を設定する。 SETATTR(X、 'Y'、V)` XY = V '' 'と等価である """ 通過 SETATTR(X、Y、V )
2.4、delattr(x、y)は
プロパティを削除します。
DEF delattr(X、Y):#実際の署名不明。__doc__から復元 「」「 与えられたオブジェクトから指定された属性を削除 delattr(X、 『Y』)が'X.Yデル``と等価である 『』」 通過 delattr(x、y)は
2.5例
1)実施例A
BlackMediumクラス: 特集= "醜い" DEF __init __(自己、名前、ADDR): self.name名= self.addr addrに= DEFのsell_house(セルフ): 印刷( "%S黒の仲介が家を売ることは" %self.name) :DEF(自己)rent_house 印刷( "%S黒の仲介を借りる" self.name%)を BlackMedium( "マンシン土地"、 "オープン日パーク")のB1 = #を、それが財産含まれているかどうかを検出し 、印刷(はhasattr(B1を、 "名前"))#True 印刷(はhasattr(B1、文字列またはNameErrorとして"sell_house"))#:名'sell_houseは'が定義されていない 名前':#NameError)#Print(はhasattr(B1、rent_houseを) sell_houseは「が定義されていない 取得#のプロパティ 印刷(GETATTR(B1、「名 "))#は==>属性データを取得し、反対にWAN "、FUNC = GETATTR(B1rent_house「)#は関数の属性を取得 、それを借りるFUNC()#ワンチェンランドマーク黒の仲介を #GETATTR(b1が、 "ABC" )#1はAttributeError与えられた属性が存在しません: 'BlackMedium'オブジェクトの属性がNO 'ABC'が 印刷(GETATTR(B1を、 "ABC"、) "不在")==不在#>属性が存在しない属性取得をGETATTR使用した場合、デフォルトの戻り値を指定することができます #のプロパティ設定 SETATTR(B1を、「SB」、 「真」)# 設定データ属性 (B1 .__ dict__に)#{プリントを 「名前を」: ' ワンを対照的に、 '' ADDR ':'オープン日公園'' SB ':'真の「} SETATTR(B1、 "SHOW_NAME"、ラムダ自己:self.name + "_ SB")#セット関数は、属性 印刷(B1 .__ dict__にします) #{ 'SB': '真 '、 '名前': ' ワン反対に'、 'SHOW_NAME':<機能 0x000001B354757F28で<ラムダ>> 'ADDR': ' パークオープン日'} 印刷(b1.show_name(B1土地))#は_sbにWAN #プロパティの削除 プリント(B1 .__ dict__に)#{ '名前を': 'Wancheng土地'' SB ':'真'' ADDR ':'オープン日パーク'' SHOW_NAME「:<関数<0x0000029A9F8D7F28 ATラムダ>>} delattr(B1、 "ADDR") delattr(B1、「SHOW_NAME 「) #Delattr(B1、 "show_name123" )#AttributeError: show_name123プロパティは不在与えられる 印刷(B1 .__ dict__に)#{ 'SB': 'TRUE'、 '名称': ' 反対に1万'}
2)実施例二
Fooクラス(オブジェクト): staticField = "oldboy" デフ__init __(自己): self.name =名前の デフFUNC(自己): リターン"FUNC" @staticmethod DEFバー(): リターン"バー" プリント(GETATTR(フー、」 staticField "))#oldboyの 印刷(GETATTR(フー、" FUNC "))#<機能Foo.func 0x00000237B782E378で> 印刷(GETATTR(Fooの、"バー"))#<機能0x00000228D871E400でFoo.bar>
3)例スリー
表示モジュール自体
インポートのSYS DEF S1(): プリント( "S1") DEF S2(): プリント( "S2") this_module = sys.modules [__ name__】 プリント(this_module)#「Gから<モジュール'__main__':/ Pythonの/反射.py '> ==> __main__表示当前模块 プリント(はhasattr(this_module、 "S1"))#True 0x000001B74743E378でプリント(GETATTR(this_module、 "S2"))#<関数S2>
4)実施例フォー
他のモジュールをインポートし、リフレクションを使用して、モジュールは、方法の存在を見ます
module_test.py:
デフテスト(): プリント(「テスト」から)
index.py:
OBJとしてインポートaaa.module_test obj.test()は、テスト#from :プリント(OBJ)#< '\\ \\ AAA \\ module_test.pyパイソンG'モジュール'からaaa.module_test'> 、印刷(はhasattr(OBJを'テスト'))#True プリント(GETATTR(OBJ、 "試験"))#<0x0000024770C3E400で機能テスト>返回函数地址 GETATTR(OBJ、 'テスト')()#from試験