在做程式開發中,我們常常會遇到這樣的需求:需要執行物件裡的某個方法,或需要呼叫物件中的某個變數,但是由於種種原因我們無法確定這個方法或變數是否存在,這是我們需要用乙個特殊的方法或機制要訪問和操作這個未知的方法或變數,這中機制就稱之為反射。接下記錄下反射幾個重要方法:
判斷物件中是否有這個方法或變數
class
person
(object):
def__init__
(self,name):
self.name = name
deftalk
(self):
print("%s正在交談"%self.name)
p = person("laowang")
print(hasattr(p,"talk")) # true。因為存在talk方法
print(hasattr(p,"name")) # true。因為存在name變數
print(hasattr(p,"abc")) # false。因為不存在abc方法或變數
獲取物件中的方法或變數的記憶體位址
class
person(object):
def__init__(self,name):
self.name = name
deftalk(self):
print("%s正在交談"%self.name)
p = person("laowang")
n = getattr(p,"name") # 獲取name變數的記憶體位址
print(n) # 此時列印的是:laowang
f = getattr(p,"talk") # 獲取talk方法的記憶體位址
f() # 呼叫talk方法
我們發現getattr有三個引數,那麼第三個引數是做什麼用的呢?
s = getattr(p,"abc","not find")
print(s) # 列印結果:not find。因為abc在物件p中找不到,本應該報錯,屬性找不到,但因為修改了找不到就輸出not find
為物件新增變數或方法
def
abc(self):
print("%s正在交談"%self.name)
class
person
(object):
def__init__
(self,name):
self.name = name
p = person("laowang")
setattr(p,"talk",abc) # 將abc函式新增到物件中p中,並命名為talk
p.talk(p) # 呼叫talk方法,因為這是額外新增的方法,需手動傳入物件
setattr(p,"age",30) # 新增乙個變數age,複製為30
print(p.age) # 列印結果:30
刪除物件中的變數。注意:不能用於刪除方法
class
person
(object):
def__init__
(self,name):
self.name = name
deftalk
(self):
print("%s正在交談"%self.name)
p = person("laowang")
delattr(p,"name") # 刪除name變數
print(p.name) # 此時將報錯
python 反射的用法
class foo def init self,name self.name name def text self return 123f foo 1 hasattr obj,name 判斷乙個物件裡面是否有name屬性,或者name方法,返回bool值,有name特性返回ture,否則 返回fal...
python反射用法
反射在python中是乙個很重要的東西,但是具體怎麼用呢?讓我們來看看。首先我們來建立乙個類,並且定義了2個普通方法,和乙個類方法 class foo dic deffunc1 self print func1 def func2 self print func2 classmethod deffu...
Python反射的用法例項分析
在做程式開發中,我們常常會遇到這樣的需求 需要執行物件裡的某個方法,或需要呼叫物件中的某個變數,但是由於種種原因我們無法確定這個方法或變數是否存在,這是我們需要用乙個特殊的方法或機制要訪問和操作這個未知的方法或變數,這中機制就稱之為反射。接下記錄下反射幾個重要方法 hasattr 判斷物件中是否有這...