在做程式開發中,我們常常會遇到這樣的需求:需要執行物件裡的某個方法,或需要呼叫物件中的某個變數,但是由於種種原因我們無法確定這個方法或變數是否存在,這是我們需要用乙個特殊的方法或機制要訪問和操作這個未知的方法或變數,這中機制就稱之為反射。接下記錄下反射幾個重要方法:
hasattr
判斷物件中是否有這個方法或變數
class person(object):
def __init__(self,name):
self.name = name
def talk(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方法或變數
getattr
獲取物件中的方法或變數的記憶體位址
class person(object):
def __init__(self,name):
self.name = name
def talk(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
setattr
為物件新增變數或方法
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) # 呼叫t程式設計客棧alk方法,因為這是額外新增的方法,需手動傳入物件
setattr(p,"age",30) # 新增乙個變數age,複製為30
print(p.age) # 列印結果:30
delattr
刪除物件中的變數。注意:不能用於刪除方法
class person(object):
def __init__(self,name):
self.name = name
def talk(self):
print("%s正在交談"%self.name)
p = person("laowang")
delattr(p,"name") # 刪除name變數
print(p.name) # 此時將報錯
python反射例項化 python反射
定義 通過字串的形式去操作物件 類,例項物件,模組中的物件 中的成員 增刪改查 叫反射。一 類例項物件class foo tests test def init self,name,age self.name name self.age age def show self return s s se...
python中as用法例項分析
import some some 程式設計客棧為乙個模組 如果想要改變被導dmsvgqzl入模組在當前模組中的名稱,而不是sys.modules中的名稱。可以使用import as,例如 import some as other print other.name 和import some dmsvg...
Python 反射的用法
在做程式開發中,我們常常會遇到這樣的需求 需要執行物件裡的某個方法,或需要呼叫物件中的某個變數,但是由於種種原因我們無法確定這個方法或變數是否存在,這是我們需要用乙個特殊的方法或機制要訪問和操作這個未知的方法或變數,這中機制就稱之為反射。接下記錄下反射幾個重要方法 判斷物件中是否有這個方法或變數 c...