反射就是通過字串的形式,匯入模組;通過字串的形式,去模組尋找指定函式,並執行。利用字串的形式去物件(模組)中操作(查詢/獲取/刪除/新增)成員,一種基於字串的事件驅動!
python為我們提供乙個強大的內建函式:getattr!我們將前面的visit修改一下,**如下:1. getattr()函式是python自省的核心函式,具體使用大體如下:class a:
def __init__(self):
self.name = 'zhangjing'
#self.age='24'
def method(self):
print"method print"
instance = a()
print getattr(instance , 'name, 'not find') #如果instance 物件中有屬性name則列印self.name的值,否則列印'not find'
print getattr(instance , 'age', 'not find') #如果instance 物件中有屬性age則列印self.age的值,否則列印'not find'
print getattr(a, 'method', 'default') #如果有方法method,否則列印其位址,否則列印default
print getattr(a, 'method', 'default')() #如果有方法method,執行函式並列印none否則列印default
2. hasattr(object, name)
說明:判斷物件object是否包含名為name的特性(hasattr是通過呼叫getattr(ojbect, name)是否丟擲異常來實現的)
3. setattr(object, name, value)
這是相對應的getattr()。引數是乙個物件,乙個字串和乙個任意值。字串可能會列出乙個現有的屬性或乙個新的屬性。這個函式將值賦給屬性的。該物件允許它提供。例如,setattr(x,「foobar」,123)相當於x.foobar = 123。
4. delattr(object, name)
與setattr()相關的一組函式。引數是由乙個物件(記住python中一切皆是物件)和乙個字串組成的。string引數必須是物件屬性名之一。該函式刪除該obj的乙個由string指定的屬性。delattr(x, 'foobar')=del x.foobar
import
commons
def
run():
inp
=
input
(
"請輸入您想訪問頁面的url: "
).strip()
func
=
getattr
(commons,inp)
func()
if
__name__
=
=
'__main__'
:
run()
首先說明一下getattr函式的使用方法:它接收2個引數,前面的是乙個物件或者模組,後面的是乙個字串,注意了!是個字串!
例子中,使用者輸入儲存在inp中,這個inp就是個字串,getattr函式讓程式去commons這個模組裡,尋找乙個叫inp的成員(是叫,不是等於),這個過程就相當於我們把乙個字串變成乙個函式名的過程。然後,把獲得的結果賦值給func這個變數,實際上func就指向了commons裡的某個函式。最後通過呼叫func函式,實現對commons裡函式的呼叫。這完全就是乙個動態訪問的過程,一切都不寫死,全部根據使用者輸入來變化。
這就是python的反射,它的核心本質其實就是利用字串的形式去物件(模組)中操作(查詢/獲取/刪除/新增)成員,一種基於字串的事件驅動!
python反射機制
本文總結python的反射機制,以及其簡單應用 首先要說的是globals 函式 在沒有任何模組匯入的情況下,執行globals函式,函式返回的是乙個包含當前作用域的全域性變數的字典,key是全域性範圍內物件的名字。globals 然後先導入乙個模組 os 在執行globals函式 import o...
python反射機制
反射的本質 反射就是通過字串的形式,匯入模組 通過字串的形式,去模組尋找指定函式,並執行。利用字串的形式去物件 模組 中操作 查詢 獲取 刪除 新增 成員,一種基於字串的事件驅動!下面我們通過反射機制在web路由上的應用來介紹反射 首先我們來看如下 的設計 users.py 模組中 visit模組中...
python反射機制
根據不同的場景執行不同的函式,可以將這種寫入配置中,讀取配置,執行對應的函式,這個時候獲取的函式為字串,如何執行該字串呢?反射就是通過字串的形式,匯入模組 反射就是通過字串的形式,匯入模組 通過字串的形式,去模組尋找指定函式,並執行。利用字串的形式去物件中操作屬性或者函式利用字串的形式去物件中操作屬...