什麼是反射
反射主要指程式可以訪問,檢測和修改它本身狀態或行為的一種能力(自省)。
物件導向的反射
getarre
getarre() ,一個內建函式
作用是通過字串型別的屬性名,得到真正的這個字串的名字對應的物件的屬性值
class Student: def __init__(self,name): self.name = name wu = Student('吳') ret = getattr(wu,'name') 此時 ret 就相當於 wu.name
hasattr
hasattr(),一個內建函式
if hasattr(a,b) 判斷b是不是物件a裡面的屬性
class Student: def __init__(self,name): self.name = name wu = Student('吳') name = input('>>>') if hasattr(wu,name): 判斷輸入的內容是否是wu這個物件裡的屬性或方法 ret = getattr(wu,name)
callable
callable(a) 一個內建函式,作用是判斷a是否可以被呼叫
例項應用
class Jay: def __init__(self,name): self.name = name def sweet(self): print('告白氣球') def warm(self): print('不能說的祕密') def real(self): print('稻香') def guitar(self): print('晴天') def nice(self): print('七里香') j = Jay('周杰倫') while 1: song = input('>>>') if hasattr(j,song): nb = getattr(j,song) if callable(nb): nb() else: print(nb) else: print('輸入錯誤,請重新輸入')
class Foo: f = '類的靜態變數' def __init__(self,name,age): self.name=name self.age=age def say_hi(self): print('hi,%s'%self.name) obj=Foo('egon',73) #檢測是否含有某屬性 print(hasattr(obj,'name')) print(hasattr(obj,'say_hi')) #獲取屬性 n=getattr(obj,'name') print(n) func=getattr(obj,'say_hi') func() print(getattr(obj,'aaaaaaaa','不存在啊')) #報錯 #設定屬性 setattr(obj,'sb',True) setattr(obj,'show_name',lambda self:self.name+'sb') print(obj.__dict__) print(obj.show_name(obj)) #刪除屬性 delattr(obj,'age') delattr(obj,'show_name') delattr(obj,'show_name111')#不存在,則報錯 print(obj.__dict__)