1. 程式人生 > >面向對象之反射(定制)

面向對象之反射(定制)

租房子 click span 領域 面向 屬性和方法 lsd 正在 ttr

什麽是反射?

反射的蓋面是由Smith在1982年首次提出的,主要是指程序可以訪問、檢測和修改它本身狀態或行為的一種能力(自省),

這一概念的提出很快引發了計算機科學領域關於應用反射的研究。它首次被程序語言的設計領域所采用。並在Lisp和面向

對象方面取得了成績。

python3中四個可以實現自省的函數,下列方法適用於類和對象

class BlackMedium:
    feture=Ugly
    def __init__(self,name,addr):
        self.name=name
        self.addr=addr
    
def 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.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
hasattr(object,name)

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))#黑中介SB
setattr(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)

面向對象之反射(定制)