Python 物件導向 反射 自省

2021-08-18 15:15:56 字數 2104 閱讀 2128

反射:程式可以訪問,檢測和修改它本身狀態或行為的一種能力(自省)

下面就介紹四種實現自省的函式,適用於類和物件

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

自省 自省。正如你所知道的,自省是指 可以檢視記憶體中以物件形式存在的其它模組和函式,獲取它們的資訊,並對它們進行操作。用這種方法,你可以定義沒有名稱的函式,不按函式宣告的引數順序呼叫函式,甚至引用事先並不知道名稱的函式。反射有時候我們會碰到這樣的需求,需要執行物件的某個方法,或是需要對物件的某個字...