4-反射學(xué)習(xí)

在python的內(nèi)置函數(shù)中,有這么幾個的內(nèi)置函數(shù) 吮铭,分別是:getattr(),setattr(),delattr(),hasattr(),

這些內(nèi)置函數(shù)主要應(yīng)用在反射臣嚣。我們在學(xué)習(xí)函數(shù)的模塊的時候,知道在應(yīng)用第三方模塊的時候剥哑,首先是要導(dǎo)入才可以使用的硅则,導(dǎo)入使用的是import,那么我們今天使用另外的一種導(dǎo)入方式株婴,也就是__import__怎虫,通過它來實現(xiàn)模塊中函數(shù)的應(yīng)用,再來引出反射的實際應(yīng)用困介。我們創(chuàng)建模塊day2,day3大审,在day2模塊中編寫login和logout的函數(shù),見代碼:

def login():
    print('我是login函數(shù)')
    
def logout():
    print('我是logout函數(shù)')

現(xiàn)在我們實現(xiàn)在day3中調(diào)用login和logout的函數(shù)座哩,我們不使用import的方式徒扶,我們通過__import__的方式,見實現(xiàn)的過程:

index=__import__('day2')

#調(diào)用day2模塊中的login函數(shù)
index.login()

#調(diào)用day3中l(wèi)ogout的函數(shù)
index.logout()

見執(zhí)行后的輸出內(nèi)容:

我是login函數(shù)
我是logout函數(shù)

依據(jù)執(zhí)行結(jié)果根穷,我們可以看到姜骡,實現(xiàn)了調(diào)用login和調(diào)用logout函數(shù)的效果,那么在這里屿良,是怎么實現(xiàn)的了圈澈?大概可以總結(jié)為:

1、通過__import__的形式導(dǎo)入模塊尘惧,并賦值給字符串

2士败、通過字符串的形式去模塊中尋找指定的函數(shù),并執(zhí)行

下面我們來通過getattr的方式褥伴,來實現(xiàn)如上的實現(xiàn)過程谅将,getattr簡單的可以理解為:“依據(jù)字符串的形式去模塊中尋找指定的目標(biāo)對象(模塊中的函數(shù),或者類中的方法)”重慢,見實現(xiàn)的代碼為:

import  day2

f=getattr(day2,'login')

f()

見執(zhí)行的結(jié)果:

我是login函數(shù)

通過getattr()的方式更加簡單饥臂,它的第一個參數(shù)是對象模塊,第二個參數(shù)是指定的模塊似踱,最后一個是默認(rèn)參數(shù)None隅熙,見getattr()方法的源碼:

def getattr(object, name, default=None): # known special case of getattr
    """
    getattr(object, name[, default]) -> value
    
    Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y.
    When a default argument is given, it is returned when the attribute doesn't
    exist; without it, an exception is raised in that case.
    """
    pass

如上的形式,可以總結(jié)為:通過字符串的形式核芽,來尋找模塊中的函數(shù)并執(zhí)行函數(shù)囚戚。粗暴的實現(xiàn)為:

import  day2

inp_func=raw_input(u'請輸入要執(zhí)行的函數(shù):\n')
target_func=getattr(day2,inp_func)
print('執(zhí)行目標(biāo)函數(shù):', target_func())

該代碼其實和最初上面的代碼實現(xiàn)思想是一致的,就是使用getattr()方法來獲取模塊中的函數(shù)并執(zhí)行函數(shù)轧简。

其實在開始的時候驰坊,已經(jīng)說了,除了getattr()內(nèi)置函數(shù)外哮独,還有其他的幾個內(nèi)置函數(shù)拳芙,具體為:

根據(jù)字符串的形式去某個模塊中尋找東西--->getattr()
根據(jù)字符串的形式去某個模塊中判斷東西是否存在--->hasattr()
根據(jù)字符串的形式去某個模塊中設(shè)置東西---->setattr()
根據(jù)字符串的形式去某個模塊中刪除東西---->delattr()

如下我們通過一個案例察藐,來引入反射的基本使用。
commons模塊的代碼為:

def index():
    print('index')

def login():
    print('login')

def logout():
    print('logout')

創(chuàng)建一個新的模塊舟扎,導(dǎo)入commons模塊分飞,來調(diào)用該模塊中編寫的方法,見實現(xiàn)的代碼:

import  commons

url=raw_input('請模擬瀏覽器輸入路由:\n')

if url.endswith('index'):
    commons.index()
elif url.endswith('login'):
    commons.login()
elif url.endswith('logout'):
    commons.logout()
else:
    print('Sorry,尋找路由失敗')

下面我們通過反射的方式來進(jìn)行修改睹限,見修改后的代碼:

import  commons

url=raw_input('請模擬瀏覽器輸入路由:\n')
per=url.split('/')[-1]
if hasattr(commons,per):
    target_function=getattr(commons,per)
    target_function()
else:
    print('Not Found 404 Page')

如上的代碼修改了很多的譬猫,但是還是有一個缺點的,就是我們需要導(dǎo)入模塊羡疗,但是在實際的工作中删窒,我們基本不清楚路由是來自哪個模塊的,需要對如上的代碼進(jìn)行二次重構(gòu)顺囊,重構(gòu)后的代碼為:

url=raw_input('請模擬瀏覽器輸入路由:\n')
target_models,target_function=url.split('/')
m=__import__(target_models)
if hasattr(m,target_function):
    target_function=getattr(m,target_function)
    target_function()
else:
    print('Not Found 404 Page')
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蕉拢,隨后出現(xiàn)的幾起案子特碳,更是在濱河造成了極大的恐慌,老刑警劉巖晕换,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件午乓,死亡現(xiàn)場離奇詭異,居然都是意外死亡闸准,警方通過查閱死者的電腦和手機益愈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來夷家,“玉大人蒸其,你說我怎么就攤上這事】饪欤” “怎么了摸袁?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長义屏。 經(jīng)常有香客問我靠汁,道長,這世上最難降的妖魔是什么闽铐? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任蝶怔,我火速辦了婚禮,結(jié)果婚禮上兄墅,老公的妹妹穿的比我還像新娘踢星。我一直安慰自己,他們只是感情好隙咸,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布斩狱。 她就那樣靜靜地躺著耳高,像睡著了一般。 火紅的嫁衣襯著肌膚如雪所踊。 梳的紋絲不亂的頭發(fā)上泌枪,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機與錄音秕岛,去河邊找鬼碌燕。 笑死,一個胖子當(dāng)著我的面吹牛继薛,可吹牛的內(nèi)容都是我干的修壕。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼遏考,長吁一口氣:“原來是場噩夢啊……” “哼慈鸠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起灌具,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤青团,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后咖楣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體督笆,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年诱贿,在試婚紗的時候發(fā)現(xiàn)自己被綠了娃肿。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡珠十,死狀恐怖料扰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情焙蹭,我是刑警寧澤记罚,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站壳嚎,受9級特大地震影響桐智,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜烟馅,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一说庭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧郑趁,春花似錦刊驴、人聲如沸聘裁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽迟隅。三九已至,卻和暖如春躲惰,著一層夾襖步出監(jiān)牢的瞬間致份,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工础拨, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留氮块,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓诡宗,卻偏偏與公主長得像滔蝉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子塔沃,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 〇蝠引、前言 本文共108張圖,流量黨請慎重蛀柴! 歷時1個半月螃概,我把自己學(xué)習(xí)Python基礎(chǔ)知識的框架詳細(xì)梳理了一遍。 ...
    Raxxie閱讀 18,918評論 17 410
  • 昨天看到羅輯思維的頭條推文名扛,總裁脫不花寫的高效管理時間的16條實用心法。每一條都很簡潔實用茧痒,對提高自己的工作效率肮韧、...
    周五讀書閱讀 313評論 0 0
  • 我很討厭異地戀 可我很喜歡你… 夢想有一天能牽著你的手去敬各位來賓的酒
    眼前人_c1b8閱讀 141評論 3 1
  • 門外是高大的杏樹,還有剛剛抽絲的絲瓜旺订,院落里一片寧靜弄企,清涼的石板路,走路都幾乎沒有聲響区拳。 一群人在老舊的辦公室里安...
    遇見小晴天閱讀 311評論 4 3