小猿圈python學(xué)習(xí)-神奇的反射

什么是反射

反射的概念是由Smith在1982年首次提出的杭隙,主要是指程序可以訪問专肪、檢測(cè)和修改它本身狀態(tài)或行為的一種能力(自市弊觥)兑凿。這一概念的提出很快引發(fā)了計(jì)算機(jī)科學(xué)領(lǐng)域關(guān)于應(yīng)用反射性的研究疤祭。它首先被程序語言的設(shè)計(jì)領(lǐng)域所采用,并在Lisp和面向?qū)ο蠓矫嫒〉昧顺煽?jī)盼产。

python面向?qū)ο笾械姆瓷?b>:通過字符串的形式操作對(duì)象相關(guān)的屬性。python中的一切事物都是對(duì)象(都可以使用反射)

四個(gè)可以實(shí)現(xiàn)自省的函數(shù)

下列方法適用于類和對(duì)象(一切皆對(duì)象勺馆,類本身也是一個(gè)對(duì)象)

def hasattr(*args, **kwargs):

? ? """

? ? Return whether the object has an attribute with the given name.

? ? This is done by calling getattr(obj, name) and catching AttributeError.

? ? """

? ? pass

def getattr(object, name, default=None):

? ? """

? ? 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

def setattr(x, y, v):

? ? """

? ? Sets the named attribute on the given object to the specified value.

? ? setattr(x, 'y', v) is equivalent to ``x.y = v''

? ? """

? ? pass

def delattr(x, y):

? ? """

? ? Deletes the named attribute from the given object.

? ? delattr(x, 'y') is equivalent to ``del x.y''

? ? """

? ? pass

用法舉例

class Person(object):

? ? def __init__(self,name,age):

? ? ? ? self.name = name

? ? ? ? self.age = age

? ? def say_hi(self):

? ? ? ? print("hi,guys , my name is " ,self.name)

obj=Person('Alex',26)

#檢測(cè)是否含有某屬性

print(hasattr(obj,'name'))

print(hasattr(obj,'say_hi'))

#獲取屬性

n=getattr(obj,'name')

print(n)

func=getattr(obj,'say_hi')

func()

print(getattr(obj,'aaaaaaaa','不存在啊')) #報(bào)錯(cuò)

#設(shè)置屬性

setattr(obj,'hobbie',"girl")

setattr(obj,'show_name',lambda self:self.name+'--%s' % self.age)

print(obj.__dict__)

print(obj.show_name(obj))

#刪除屬性

delattr(obj,'age')

delattr(obj,'show_name')

#delattr(obj,'show_name111') # 不存在,則報(bào)錯(cuò)

print(obj.__dict__)

反射模塊成員

除了可以用來檢測(cè)類中有沒有某個(gè)方法戏售,還可以用來檢測(cè)模塊下有沒有方法侨核、類、或者變量

def s1():

? ? print('s1')

class Person(object):

? ? def __init__(self,name,age):

? ? ? ? self.name = name

? ? ? ? self.age = age

name = "test"

this_module = sys.modules[__name__] # __name__ 會(huì)動(dòng)態(tài)的代表當(dāng)前模塊名

print(hasattr(this_module, 's1'))

print(hasattr(this_module, 'name'))

print(getattr(this_module, 'Person'))

p = getattr(this_module, 'Person')

p("Alex",22)

反射從其它模塊導(dǎo)入的方法

反射的應(yīng)用

了解了反射的四個(gè)函數(shù)灌灾。那么反射到底有什么用呢搓译?它的應(yīng)用場(chǎng)景是什么呢?

現(xiàn)在讓我們打開瀏覽器锋喜,訪問一個(gè)網(wǎng)站侥衬,你單擊登錄就跳轉(zhuǎn)到登錄界面,你單擊注冊(cè)就跳轉(zhuǎn)到注冊(cè)界面跑芳,等等轴总,其實(shí)你單擊的其實(shí)是一個(gè)個(gè)的鏈接,每一個(gè)鏈接都會(huì)有一個(gè)函數(shù)或者方法來處理博个。

沒學(xué)反射之前的解決方式

class User:

? ? def login(self):

? ? ? ? print('歡迎來到登錄頁面')

? ? def register(self):

? ? ? ? print('歡迎來到注冊(cè)頁面')

? ? def save(self):

? ? ? ? print('歡迎來到存儲(chǔ)頁面')

while 1:

? ? choose = input('>>>').strip()

? ? if choose == 'login':

? ? ? ? obj = User()

? ? ? ? obj.login()

? ? elif choose == 'register':

? ? ? ? obj = User()

? ? ? ? obj.register()

? ? elif choose == 'save':

? ? ? ? obj = User()

? ? ? ? obj.save()

學(xué)了反射之后解決方式

class User:

? ? def login(self):

? ? ? ? print('歡迎來到登錄頁面')

? ? def register(self):

? ? ? ? print('歡迎來到注冊(cè)頁面')

? ? def save(self):

? ? ? ? print('歡迎來到存儲(chǔ)頁面')

user = User()

while 1:

? ? choose = input('>>>').strip()

? ? if hasattr(user,choose):

? ? ? ? func = getattr(user,choose)

? ? ? ? func()

? ? else:

? ? ? ? print('輸入錯(cuò)誤怀樟。。盆佣。往堡。')

這樣就可以明確的感覺到反射的好處

動(dòng)態(tài)加載模塊

如果在程序去過過程中,要求程序按用戶輸入的指令字符串導(dǎo)入對(duì)應(yīng)的模塊共耍,在只知道一個(gè)模塊的字符串名字的情況下虑灰,能否導(dǎo)入?

import importlib

__import__('import_lib.metaclass') #這是解釋器自己內(nèi)部用的

#importlib.import_module('import_lib.metaclass') #與上面這句效果一樣痹兜,官方建議用這個(gè)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末穆咐,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子字旭,更是在濱河造成了極大的恐慌对湃,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件遗淳,死亡現(xiàn)場(chǎng)離奇詭異拍柒,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)屈暗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門拆讯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人养叛,你說我怎么就攤上這事种呐。” “怎么了一铅?”我有些...
    開封第一講書人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵陕贮,是天一觀的道長(zhǎng)堕油。 經(jīng)常有香客問我潘飘,道長(zhǎng)肮之,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任卜录,我火速辦了婚禮戈擒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘艰毒。我一直安慰自己筐高,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開白布丑瞧。 她就那樣靜靜地躺著柑土,像睡著了一般。 火紅的嫁衣襯著肌膚如雪绊汹。 梳的紋絲不亂的頭發(fā)上稽屏,一...
    開封第一講書人閱讀 51,698評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音西乖,去河邊找鬼狐榔。 笑死,一個(gè)胖子當(dāng)著我的面吹牛获雕,可吹牛的內(nèi)容都是我干的薄腻。 我是一名探鬼主播,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼届案,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼庵楷!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起楣颠,我...
    開封第一講書人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤嫁乘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后球碉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蜓斧,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年睁冬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了挎春。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡豆拨,死狀恐怖直奋,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情施禾,我是刑警寧澤脚线,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站弥搞,受9級(jí)特大地震影響邮绿,放射性物質(zhì)發(fā)生泄漏渠旁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一船逮、第九天 我趴在偏房一處隱蔽的房頂上張望顾腊。 院中可真熱鬧,春花似錦挖胃、人聲如沸杂靶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吗垮。三九已至,卻和暖如春凹髓,著一層夾襖步出監(jiān)牢的瞬間抱既,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來泰國打工扁誓, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留防泵,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓蝗敢,卻偏偏與公主長(zhǎng)得像捷泞,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子寿谴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355

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

  • 面向?qū)ο筮M(jìn)階 isinstance和issubclass isinstance(obj,cls)檢查是否obj是否...
    go以恒閱讀 461評(píng)論 0 0
  • 8月22日-----字符串相關(guān) 2-3 個(gè)性化消息: 將用戶的姓名存到一個(gè)變量中讶泰,并向該用戶顯示一條消息咏瑟。顯示的消...
    future_d180閱讀 973評(píng)論 0 1
  • 一、Python簡(jiǎn)介和環(huán)境搭建以及pip的安裝 4課時(shí)實(shí)驗(yàn)課主要內(nèi)容 【Python簡(jiǎn)介】: Python 是一個(gè)...
    _小老虎_閱讀 5,746評(píng)論 0 10
  • 摘 菜 陳倉實(shí)驗(yàn)小學(xué) 二年級(jí) 王成圓 一天大早痪署,我從夢(mèng)中醒來码泞,抬起了一千...
    海底浪花閱讀 734評(píng)論 1 7
  • 15個(gè)小孩子的大課堂 積極,陽光狼犯,懂事余寥,熱鬧…
    平和陽光努力向往美好生活閱讀 84評(píng)論 0 1