Python強(qiáng)大的自省機(jī)制詳解
何為自省
在計(jì)算機(jī)編程領(lǐng)域里,自省是一種能力,是通過(guò)一定機(jī)制在程序運(yùn)行時(shí)獲知對(duì)象的類(lèi)型及對(duì)象的內(nèi)部結(jié)構(gòu),Python的自省能力還是很強(qiáng)大的,因?yàn)镻ython中一切皆對(duì)象,我們不僅可以獲取對(duì)象的類(lèi)型,還可以獲取對(duì)象內(nèi)部的屬性。下面就來(lái)介紹一下Python中一些提供強(qiáng)大自省能力的方法。
dir()函數(shù)
它是用于自省的最重要的函數(shù)之一。它以列表的形式返回一個(gè)對(duì)象所擁有的全部屬性和方法,如果dir()不傳任何參數(shù),默認(rèn)是查找當(dāng)前命名空間有什么對(duì)象。
user = {"nickname": "tigeriaf", "level": 2} print(dir(user))
執(zhí)行結(jié)果為:
上面的dir()自省輸出了一個(gè)字典對(duì)象的所有方法的名字。當(dāng)我們記不太清某個(gè)對(duì)象的某個(gè)方法的名字時(shí),使用這個(gè)是非常有幫助的。
type()函數(shù)和id()函數(shù)
type()函數(shù)返回一個(gè)對(duì)象的類(lèi)型。例如:
print(type('tigeriaf')) # 結(jié)果輸出為 <class 'str'> print(type(2)) # 結(jié)果輸出為 <class 'int'> print(type([1, 2, 3])) # 結(jié)果輸出為 <class 'list'>
id()函數(shù)返回對(duì)象的唯一標(biāo)識(shí)符,是一個(gè)整數(shù),在CPython中id()函數(shù)用于獲取對(duì)象的內(nèi)存地址。例如:
print(id('tigeriaf'))
# 結(jié)果輸出為 51064768
inspect模塊
inspect是Python的標(biāo)準(zhǔn)庫(kù),提供了更加強(qiáng)大的自省能力,提供了很多函數(shù)幫助獲取對(duì)象的信息,例如模塊、類(lèi)、方法、函數(shù)、回溯、幀對(duì)象以及代碼對(duì)象。
該模塊提供了4種主要的功能:類(lèi)型檢查、獲取源代碼、檢查類(lèi)與函數(shù)、檢查解釋器的調(diào)用堆棧。下面介紹一下其中的幾個(gè)常用的方法:
getmembers(object, predicate=None)函數(shù)
是基于dir()實(shí)現(xiàn)的,返回一個(gè)包含對(duì)象的所有成員的(name, value)列表。返回的內(nèi)容比對(duì)象的__dict__包含的內(nèi)容多。predicate是可選的參數(shù),被此函數(shù)判斷為T(mén)rue的成員才被返回。
例如:
import inspect print(inspect.getmembers(list))
signature(obj, *, follow_wrapped=True)函數(shù)
將返回一個(gè)inspect.Signature類(lèi)型的對(duì)象,值為這個(gè)函數(shù)的所有參數(shù)。
getmodule(object)函數(shù)
返回定義對(duì)象的模塊。
getsource(object)函數(shù)
返回對(duì)象的源代碼。
getsourcelines(object)函數(shù)
返回一個(gè)元組,元組第一項(xiàng)為對(duì)象源代碼行的列表,第二項(xiàng)是第一行源代碼的行號(hào)。 例如:
import inspect def test(a: int): print(a) print(inspect.signature(test)) print(inspect.getmodule(test)) print(inspect.getsource(test)) print(inspect.getsourcelines(test))
執(zhí)行結(jié)果如下:
ismodule()、isclass()、ismethod()、isfunction()、isgenerator()函數(shù)等等
一系列判斷對(duì)象類(lèi)型的方法,大都是封裝了isinstance(object, types.FunctionType)之類(lèi)語(yǔ)句的函數(shù)。
如果平時(shí)的開(kāi)發(fā)中對(duì)模塊、類(lèi)的操作比較多,那么inspect模塊一定要學(xué)習(xí)一下。
hasattr()函數(shù)和getattr()函數(shù)
dir()函數(shù)會(huì)返回某個(gè)對(duì)象所有屬性的列表,但是如果只想測(cè)試一個(gè)或多個(gè)屬性是否存在,就需要hasattr()函數(shù)和 getattr()函數(shù)來(lái)完成了,它們的功能分別為判斷對(duì)象是否有某個(gè)屬性、獲得某個(gè)屬性值。 例如:
class MyObj: def __init__(self): self.name = 'my_obj' self.a = 1 self.b = [1, 2, 3] myobj = MyObj() print(getattr(myobj, "name")) print(getattr(myobj, "b")) print(hasattr(myobj, "a")) print(hasattr(myobj, "c"))
執(zhí)行結(jié)果為:
總結(jié)
其實(shí)Python對(duì)自省有著很大的支持,Python中還有很多這里沒(méi)提到的其他方法也能有助于自省,有興趣的話,你會(huì)慢慢發(fā)現(xiàn)它們的。
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Selenium鼠標(biāo)與鍵盤(pán)事件常用操作方法示例
這篇文章主要介紹了Selenium鼠標(biāo)與鍵盤(pán)事件常用操作方法,結(jié)合實(shí)例形式分析了Selenium鼠標(biāo)事件與鍵盤(pán)事件常見(jiàn)方法與相關(guān)使用技巧,需要的朋友可以參考下2018-08-08python隨機(jī)生成庫(kù)faker庫(kù)api實(shí)例詳解
今天小編就為大家分享一篇python隨機(jī)生成庫(kù)faker庫(kù)api實(shí)例詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11Python基于staticmethod裝飾器標(biāo)示靜態(tài)方法
這篇文章主要介紹了Python基于staticmethod裝飾器標(biāo)示靜態(tài)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10解決Pymongo insert時(shí)會(huì)自動(dòng)添加_id的問(wèn)題
這篇文章主要介紹了解決Pymongo insert時(shí)會(huì)自動(dòng)添加_id的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12