Python中的反射知識(shí)點(diǎn)總結(jié)
通過(guò)字符串映射或修改程序運(yùn)行時(shí)的狀態(tài)、屬性、方法, 可以通過(guò)下面這4中方法
''' 使用getattr(object, name_str, default=None) 方法獲取object對(duì)象里 對(duì)應(yīng)的方法或者屬性的內(nèi)存地址 如果是屬性:直接返回屬性值 如果是方法:返回方法的內(nèi)存地址 ''' # hasattr(object,name_str) 判斷object對(duì)象是否有一個(gè)名為name_str的方法或者屬性
代碼演示:
# -*- coding:utf8 -*- class Person(object): def __init__(self, name): self.name = name def fun(self): print("%s正在玩耍" % self.name) p1 = Person("某人飛") name_str = input("請(qǐng)輸入方法或者屬性").strip() # hasattr(object,name_str) 判斷object對(duì)象是否有一個(gè)名為name_str的方法或者屬性 if hasattr(p1, name_str): ''' 如果有就可以使用getattr(object, name_str, default=None) 方法獲取object對(duì)象里 對(duì)應(yīng)的方法或者屬性的內(nèi)存地址 如果是屬性:直接返回屬性值 如果是方法:返回方法的內(nèi)存地址 ''' print(getattr(p1, name_str , 80)) # >>>name: 某人飛 # >>>fun : <bound method Person.fun of <__main__.Person object at 0x0000020B76A81370>> # 所以如果是方法,那么可以這么處理 a = getattr(p1, name_str) a() else: print("該對(duì)象沒(méi)有這些屬性和方法") 判斷和獲取的演示
如果對(duì)象沒(méi)有從鍵盤(pán)錄入的該方法,那么可以使用,setattr添加一個(gè)方法
def bulk(self): print("這是在%s對(duì)象的類外部創(chuàng)建的方法"%self.name) class Person(object): def __init__(self, name): self.name = name def fun1(self): print("%s正在玩耍" % self.name) p1 = Person("某人飛") name_str = input("請(qǐng)輸入您的方法或者屬性").strip() if hasattr(p1, name_str): a = getattr(p1, name_str) a() else: #如果沒(méi)有這個(gè)方法,那么為其創(chuàng)建一個(gè)已經(jīng)存在的方法 """ setattr(p1, name_str, bulk) 為對(duì)象p1添加一個(gè)已經(jīng)存在的bulk的方法,命名為name_str """ setattr(p1, name_str, bulk) a = getattr(p1, name_str) a(p1) """ 運(yùn)行結(jié)果 請(qǐng)輸入您的方法或者屬性u(píng)i 這是在某人飛對(duì)象的類外部創(chuàng)建的方法 """ setattr(p1, name_str, bulk)添加方法
如果對(duì)象沒(méi)有從鍵盤(pán)錄入的該方法,那么可以使用,setattr添加一個(gè)屬性
class Person(object): def __init__(self, name): self.name = name p1 = Person("某人飛") name_str = input("請(qǐng)輸入您的方法或者屬性").strip() if hasattr(p1, name_str): a = getattr(p1, name_str) print(a) # 也可以同setattr修該已有屬性的值 setattr(p1, name_str, "飛") print(p1.name) else: #如果沒(méi)有這個(gè)屬性,那么為其添加一個(gè)屬性 ,并為其設(shè)置一個(gè)默認(rèn)值20 setattr(p1, name_str, 20) a = getattr(p1, name_str) print(a) """ 運(yùn)行結(jié)果: 請(qǐng)輸入您的方法或者屬性name 某人飛 飛 運(yùn)行結(jié)果: 請(qǐng)輸入您的方法或者屬性age 20 """ setattr(p1, name_str, index)添加屬性
刪除對(duì)象中的屬性和方法(其中方法并不能刪除)
class Person(object): def __init__(self, name): self.name = name def fun(self): print("這是一個(gè)實(shí)例方法") p1 = Person("某人飛") name_str = input("請(qǐng)輸入您的方法或者屬性").strip() if hasattr(p1, name_str): # 刪除這個(gè)對(duì)象的屬性或者方法 delattr(p1, name_str) else: pass print(p1.name) p1.fun() """ 運(yùn)行結(jié)果: 請(qǐng)輸入您的方法或者屬性name AttributeError: 'Person' object has no attribute 'name' 運(yùn)行結(jié)果: 請(qǐng)輸入您的方法或者屬性fun AttributeError: fun """ delattr(p1, name_str)只能刪除屬性,和動(dòng)態(tài)添加的方法
注意:通過(guò)delattr能夠刪除通過(guò)setattr動(dòng)態(tài)添加的方法,其實(shí)也是一個(gè)假象。真相是通過(guò)setattr添加的一個(gè)方法并不是真的給這個(gè)對(duì)象添加了一個(gè)方法,而是添加了一個(gè)屬性,setattr方法的第二個(gè)參數(shù)就是這個(gè)屬性的名字,然后這個(gè)屬性的值是一個(gè)指向外部函數(shù)的引用地址,所以當(dāng)我們調(diào)用這個(gè)對(duì)象的屬性時(shí),實(shí)際上是間接調(diào)用了這個(gè)函數(shù),看起來(lái)就像是這個(gè)對(duì)象添加了一個(gè)方法一樣,但本質(zhì)上仍然是添加的一個(gè)屬性。不管是setattr和delattr,其實(shí)都只能針對(duì)對(duì)象的屬性進(jìn)行操作,它們對(duì)對(duì)象的方法是無(wú)法直接操作的。
到此這篇關(guān)于Python中的反射知識(shí)點(diǎn)總結(jié)的文章就介紹到這了,更多相關(guān)Python中的反射內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python+OpenCV實(shí)現(xiàn)相機(jī)標(biāo)定的方法詳解
opencv中內(nèi)置了張正友的棋盤(pán)格標(biāo)定法,通過(guò)一些姿態(tài)各異的棋盤(pán)格圖像,可以標(biāo)定相機(jī)的內(nèi)外參數(shù),本文為大家介紹OpenCV進(jìn)行相機(jī)標(biāo)定的具體方法,希望對(duì)大家有所幫助2023-05-05CentOS 7下Python 2.7升級(jí)至Python3.6.1的實(shí)戰(zhàn)教程
Centos是目前最為流行的Linux服務(wù)器系統(tǒng),其默認(rèn)的Python 2.x,這篇文章主要給大家分享了關(guān)于在CentOS 7下Python 2.7升級(jí)至Python3.6.1的實(shí)戰(zhàn)教程,文中將升級(jí)的步驟一步步的介紹的非常詳細(xì),對(duì)大家的理解和學(xué)習(xí)具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-07-07python中selenium操作下拉滾動(dòng)條的幾種方法匯總
這篇文章主要介紹了python中selenium操作下拉滾動(dòng)條的幾種方法匯總,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07七個(gè)非常實(shí)用的Python工具包總結(jié)
Python 擁有海量的包,無(wú)論是普通任務(wù)還是復(fù)雜任務(wù),我們經(jīng)常在應(yīng)用程序中使用大量的工具包.本文我將討論一些常被低估的數(shù)據(jù)科學(xué)包,包括:數(shù)據(jù)清理、應(yīng)用程序開(kāi)發(fā)和調(diào)試方面,需要的朋友可以參考下2021-06-06Numpy創(chuàng)建NumPy矩陣的簡(jiǎn)單實(shí)現(xiàn)
本文主要介紹了Numpy創(chuàng)建NumPy矩陣的簡(jiǎn)單實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02Python實(shí)現(xiàn)SQL注入檢測(cè)插件實(shí)例代碼
這篇文章主要給大家介紹了關(guān)于Python實(shí)現(xiàn)SQL注入檢測(cè)插件的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-02-02python實(shí)現(xiàn)的jpg格式圖片修復(fù)代碼
這篇文章主要介紹了python實(shí)現(xiàn)的jpg格式圖片修復(fù)代碼,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-04-04pandas的排序、分組groupby及cumsum累計(jì)求和方式
這篇文章主要介紹了pandas的排序、分組groupby及cumsum累計(jì)求和方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05python讀取TXT到數(shù)組及列表去重后按原來(lái)順序排序的方法
這篇文章主要介紹了python讀取TXT到數(shù)組及列表去重后按原來(lái)順序排序的方法,涉及Python操作txt文件、列表去重及排序的相關(guān)技巧,需要的朋友可以參考下2015-06-06使用 Python 合并多個(gè)格式一致的 Excel 文件(推薦)
這篇文章主要介紹了使用 Python 合并多個(gè)格式一致的 Excel 文件,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12