面向對象之反射(定制)
阿新 • • 發佈:2018-09-10
租房子 click span 領域 面向 屬性和方法 lsd 正在 ttr
什麽是反射?
反射的蓋面是由Smith在1982年首次提出的,主要是指程序可以訪問、檢測和修改它本身狀態或行為的一種能力(自省),
這一概念的提出很快引發了計算機科學領域關於應用反射的研究。它首次被程序語言的設計領域所采用。並在Lisp和面向
對象方面取得了成績。
python3中四個可以實現自省的函數,下列方法適用於類和對象
class BlackMedium: feture=‘Ugly‘ def __init__(self,name,addr): self.name=name self.addr=addrdef sell_hourse(self): print(‘[%s]正在賣房子,傻逼才買呢‘%self.name) def rent_hourse(self): print(‘[%s]正在租房子,傻逼才買呢‘%self.name) b1=BlackMedium(‘黑中介‘,‘殯儀館‘)
1、hasattr(object,name)
判斷object中有沒有一個name字符串對應的方法或屬性
class BlackMedium: feture=‘Ugly‘ def __init__(self,name,addr): self.namehasattr(object,name)=name self.addr=addr def sell_hourse(self): print(‘[%s]正在賣房子,傻逼才買呢‘%self.name) def rent_hourse(self): print(‘[%s]正在租房子,傻逼才買呢‘%self.name) b1=BlackMedium(‘黑中介‘,‘殯儀館‘) print(b1.__dict__)#{‘name‘: ‘黑中介‘, ‘addr‘: ‘殯儀館‘} # b1.name------->b1.__dict__[‘name] print(b1.name)#黑中介 print(b1.addr)#殯儀館 #用hasattr檢測類的屬性和方法,存在返回TRUE,不存在返回FALSE print(hasattr(b1,‘name‘))#True print(hasattr(b1,‘addr‘))#True print(hasattr(b1,‘namnmae‘))#False
2、getattr(object,name,default=None)
檢測正確時,有屬性就返回屬性值,有方法就返回方法的內存地址,加()就可以運行
檢測有錯誤時,不給default賦值會報錯,報錯時寫什麽會提示什麽
#檢測屬性,屬性存在就會打印值,屬性不存在會打印報錯或default print(getattr(b1,‘name‘))#黑中介 print(getattr(b1,‘aaaaaa‘))#有報錯提示 print(getattr(b1,‘aaaaaa‘,‘沒有此屬性‘))#有報錯提示:沒有此屬性 #檢測方法,有則返回內存地址,加()就可以運行,沒有則報錯或提示default信息 print(getattr(b1,‘sell_hourse‘,‘無此方法‘))#返回sell_hourse方法的內存地址,-------》b1.sell_hourse #<bound method BlackMedium.sell_hourse of <__main__.BlackMedium object at 0x0000020EE5447198>> #有內存地址加()就可以運行 func=getattr(b1,‘sell_hourse‘) func()#[黑中介]正在賣房子,傻逼才買呢 print(getattr(b1,‘jskdkflsd‘,‘無此方法‘))#無此方法getattr(object,name,default)
3、setattr(x,y,z)
可以增加修改屬性,也可以增加方法,
x傳入對象,y傳入字符串相當於字典中的key,x傳入值相當於字典中的value
print(b1.__dict__)#{‘name‘: ‘黑中介‘, ‘addr‘: ‘殯儀館‘} setattr(b1,‘name‘,‘SB‘)#修改屬性 setattr(b1,‘sb‘,True)#增加屬性 print(b1.__dict__)#{‘name‘: ‘SB‘, ‘addr‘: ‘殯儀館‘, ‘sb‘: True} setattr(b1,‘func‘,lambda self:self.name+‘SB‘)#增加函數屬性 # print(b1.func(b1))#黑中介SBsetattr(x,y,z)
4、delattr(x,y)
刪除屬性x,y同上
print(b1.__dict__)#{‘name‘: ‘黑中介‘, ‘addr‘: ‘殯儀館‘} delattr(b1,‘name‘)#刪除屬性------》del b1.name # del b1.name print(b1.__dict__)#{‘addr‘: ‘殯儀館‘}setattr(x,y)
面向對象之反射(定制)