反射:程式可以訪問,檢測和修改它本身狀態或行為的一種能力(自省)
下面就介紹四種實現自省的函式,適用於類和物件
1,判斷object中有沒有乙個name字串對應的屬性或者方法
hasattr(object,name)
2,獲取object中name字串對應的屬性值或者方法位址,其中default引數的作用是,在找不到屬性的時候,給予呼叫者的提示 資訊。
getattr(object,name,default= none)
3,將object中name字串對應的屬性值設定為value,這個屬性可以是新增的屬性。
setattr(object,name,value)
4,刪除object中name字串對應的屬性。
delattr(object,name)
四個方法的演示
class blackmedium:
feture = 'ugly'
def __init__(self,name,addr):
self.name = name
self.addr = addr
def sell_house(self):
print('%s賣房子'%(self.name))
def rent_house(self):
print('%s租房子'%(self.name))
b1 = blackmedium('萬成置地','天露園')
#檢測是否含有某個屬性
print(hasattr(b1,'name'))
print(hasattr(b1,'sell_house'))
#獲取屬性
temp = getattr(b1,'name')
print(temp)
func = getattr(b1,'rent_house')
func()
#getattr(b1,'aaaaaa') 獲取不存在的屬性,就會報錯。
print(getattr(b1,'aaaaa','該屬性不存在'))
#設定資料屬性和方法屬性
setattr(b1,'sb',true)
setattr(b1,'show_name',lambda self:self.name + 'sb')
print(b1.__dict__)
print(b1.show_name(b1))
#刪除屬性
delattr(b1,'addr')
delattr(b1,'show_name')
#刪除不存在的屬性,報錯
delattr(b1,'show_name123')
print(b1.__dict__)
為什麼用反射呢?
舉例:兩個程式設計師a,b,a在寫程式用到b寫的類,但是b還沒有完成這個類的編寫。此時就可以用到反射,完成a自己想要編寫 的**。並且不影響b的後期編碼。
好處:可以事先定義好介面,介面只有在被完成時,才會真正執行,實現了即插即用,也就是一種後期繫結,即先定義介面,後 期在實現介面的功能。
b還沒有實現的全部功能
class ftpclient:
#ftp客戶端,但是還沒有實現功能
def __init__(self,addr):
print('正在連線伺服器[%s]'%(self.addr))
self.addr = addr
a後期的**編寫
from module import ftpclient
f1 = ftpclient('198.1.1.1')
#在編寫某個方法前,先判斷該方法是否存在,存在就可以直接呼叫,不存在就要編寫。
if hasattr(f1,'get'):
func_get = getattr(f1,'get')
func_get()
else
print('-----》不存在這個方法')
print('處理其他的邏輯')
python反射 自省
反射 自省 的簡單理解 通過類名例項化物件 得到類的所有屬性和函式,並實現呼叫 簡單示例 coding utf 8 class user object def init self self.name abc self.age 18 defintroduce self print my name is...
python反射(自省)
前幾天用owlready構建rdf檔案時,使用類定義實體,屬性和資料屬性,類名就是乙個object,所有建立例項都需要例項類,但是現在資料有很多,我需要讓他們自動建立類的例項,他們的型別為字串,我需要把他們轉為該字串對應的類名,這裡提供了乙個方法 eval 例如name nametype 字串 cl...
python 反射 自省 inspect
自省 自省。正如你所知道的,自省是指 可以檢視記憶體中以物件形式存在的其它模組和函式,獲取它們的資訊,並對它們進行操作。用這種方法,你可以定義沒有名稱的函式,不按函式宣告的引數順序呼叫函式,甚至引用事先並不知道名稱的函式。反射有時候我們會碰到這樣的需求,需要執行物件的某個方法,或是需要對物件的某個字...