py 中反射的基本應用和總結
阿新 • • 發佈:2020-08-15
#反射: 程式可以訪問、檢查和修改它本身的狀態的行為的一種能力
#python中在面向物件中的反射:通過字串的形式操作物件相關屬性,通過字串讓物件自檢是否有字串表示的屬性。
#python當中 反射提供的方法:hasattr/getattr/setattr/delattr
1、hasattr:根據字串的形式去某個模組判斷是否存在某物件
hasattr(obj, 'string') 讓obj自省自檢有沒有和string名符合的屬性,有返回True,沒有返回False。
2、getattr:根據字串的形式去某個模組當中尋找某物件
getattr(obj, 'string', None) 返回obj和string名相同的繫結方法。可以用來讓一個變數引用這個返回結果,後面就可以call這個變數,相當於call物件的繫結方法.如果沒有,返回None,沒有第三個引數則丟擲異常
3、setattr:根據字串的形式去某個模組當中設定某物件
setattr(obj, 'string', val) obj設定一個和string同名的的屬性,並賦值為val。
4、delattr:根據字串的形式去某個模組當中刪除某物件
delattr(obj, 'string') 刪除obj物件的‘string’的同名的屬性。
哪些物件可以使用反射:
python中一切都是物件,都可以使用反射來進行自檢
1、類可以對類的共有屬性,方法(繫結方法,非繫結方法)進行反射
2、模組也可以進行反射。如:判定匯入的模組是否有某個方法,有就呼叫。--->實際上,反射在java當中是很強大的東西,但是在python當中也可以使用,比如在一些關鍵字驅動的框架裡面,就會有反射相關的應用
例:=====================
class People(object): def __init__(self, name, age): self.name = name self.age = age def speak(self): print('%s is speaking' % self.name) obj = People('qika', 18) f = input('qika:').strip() #strip()清除格式 if hasattr(obj, f): #hasattr 判斷是否存在obj,f兩個變數 getattr(obj, f)() func1 = getattr(obj, f) func1() else: print('名字:{} 說:{}'.format(obj.name, f))
例:================================
#物件應用反射 class Foo: def __init__(self): self.name = 'qika' self.age = 18 def func(self): print('hello') f = Foo() setattr(f,'sex','男') #設定一個屬性("sex","男") print(f.sex) #列印一下里面的這個屬性。其中的f是自己定義的變數,用來接收Foo()類例項化;然後直接呼叫屬性:f.sex delattr(f,"sex") #同上,這裡進行“刪除一個屬性” hasattr(f,'name') #同上,判斷name屬性是否存在 if hasattr(f,'func'): #連著一起使用:判斷是否存在 getattr(f,'func')() #查詢f(即Foo類例項化的接收的變數名)內這個func這個屬性方法 else: print('沒找到')
例:=================================
#類中的反射 class Foo: f = 123 @classmethod def class_method_dome(cls): print('class_method_dome') @staticmethod def static_method_dome(): print('static_method_dome') print(hasattr(Foo,'class_method_dome')) method = getattr(Foo,'class_method_dome') method() print('------------') print(hasattr(Foo,'static_method_dome')) method1 = getattr(Foo,'static_method_dome') method1()