一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術(shù)及教程分享平臺!
分類導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Python - Python強大的自省機制詳解

Python強大的自省機制詳解

2022-03-08 00:07程序員-夏天 Python

這篇文章主要為大家介紹了Python強大的自省機制,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

 

何為自省

在計算機編程領(lǐng)域里,自省是一種能力,是通過一定機制在程序運行時獲知對象的類型及對象的內(nèi)部結(jié)構(gòu),Python的自省能力還是很強大的,因為Python中一切皆對象,我們不僅可以獲取對象的類型,還可以獲取對象內(nèi)部的屬性。下面就來介紹一下Python中一些提供強大自省能力的方法。

 

dir()函數(shù)

它是用于自省的最重要的函數(shù)之一。它以列表的形式返回一個對象所擁有的全部屬性和方法,如果dir()不傳任何參數(shù),默認(rèn)是查找當(dāng)前命名空間有什么對象。

user = {"nickname": "tigeriaf", "level": 2}
print(dir(user))

執(zhí)行結(jié)果為:

Python強大的自省機制詳解

上面的dir()自省輸出了一個字典對象的所有方法的名字。當(dāng)我們記不太清某個對象的某個方法的名字時,使用這個是非常有幫助的。

 

type()函數(shù)和id()函數(shù)

type()函數(shù)返回一個對象的類型。例如:

print(type("tigeriaf"))
# 結(jié)果輸出為 <class "str">
print(type(2))
# 結(jié)果輸出為 <class "int">
print(type([1, 2, 3]))
# 結(jié)果輸出為 <class "list">

id()函數(shù)返回對象的唯一標(biāo)識符,是一個整數(shù),在CPython中id()函數(shù)用于獲取對象的內(nèi)存地址。例如:

print(id("tigeriaf")) 

# 結(jié)果輸出為 51064768

 

inspect模塊

inspect是Python的標(biāo)準(zhǔn)庫,提供了更加強大的自省能力,提供了很多函數(shù)幫助獲取對象的信息,例如模塊、類、方法、函數(shù)、回溯、幀對象以及代碼對象。
該模塊提供了4種主要的功能:類型檢查、獲取源代碼、檢查類與函數(shù)、檢查解釋器的調(diào)用堆棧。下面介紹一下其中的幾個常用的方法:

 

getmembers(object, predicate=None)函數(shù)

是基于dir()實現(xiàn)的,返回一個包含對象的所有成員的(name, value)列表。返回的內(nèi)容比對象的__dict__包含的內(nèi)容多。predicate是可選的參數(shù),被此函數(shù)判斷為True的成員才被返回。

例如:

import inspect
print(inspect.getmembers(list))

Python強大的自省機制詳解

 

signature(obj, *, follow_wrapped=True)函數(shù)

將返回一個inspect.Signature類型的對象,值為這個函數(shù)的所有參數(shù)。

 

getmodule(object)函數(shù)

返回定義對象的模塊。

 

getsource(object)函數(shù)

返回對象的源代碼。

 

getsourcelines(object)函數(shù)

返回一個元組,元組第一項為對象源代碼行的列表,第二項是第一行源代碼的行號。 例如:

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é)果如下:

Python強大的自省機制詳解

 

ismodule()、isclass()、ismethod()、isfunction()、isgenerator()函數(shù)等等

一系列判斷對象類型的方法,大都是封裝了isinstance(object, types.FunctionType)之類語句的函數(shù)。

如果平時的開發(fā)中對模塊、類的操作比較多,那么inspect模塊一定要學(xué)習(xí)一下。

 

hasattr()函數(shù)和getattr()函數(shù)

dir()函數(shù)會返回某個對象所有屬性的列表,但是如果只想測試一個或多個屬性是否存在,就需要hasattr()函數(shù)和 getattr()函數(shù)來完成了,它們的功能分別為判斷對象是否有某個屬性、獲得某個屬性值。 例如:

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é)果為:

Python強大的自省機制詳解

 

總結(jié)

其實Python對自省有著很大的支持,Python中還有很多這里沒提到的其他方法也能有助于自省,有興趣的話,你會慢慢發(fā)現(xiàn)它們的。

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注服務(wù)器之家的更多內(nèi)容!

原文鏈接:https://blog.csdn.net/weixin_50097774/article/details/121477598

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日本aaaaa高清免费看 | 国产在线观看人成激情视频 | 亚洲AV久久无码精品九九软件 | 海绵宝宝第二季全集免费观看 | 国产99区| 隔壁老王国产在线精品 | 国产肥老上视频 | 猛男强攻变sao货 | 国产资源站| 精品一区二区国语对白 | 亚洲精品一区二区久久久久 | 肉蒲在线观看 | 狐媚小说 | 高清国语自产拍免费视频国产 | 91网红福利精品区一区二 | 精品免费看 | 久久99亚洲热最新地址获取 | 地址二地址三2021变更 | 2019自拍偷拍视频 | 成人免费体验区福利云点播 | 色戒完整版2小时38分钟 | 成人影院观看 | 韩国三级 720p | 美女班主任下面好爽好湿好紧 | sao虎影院桃红视频在线观看 | 日韩成人小视频 | 视频在线观看高清免费看 | 国产精品久久久久久 | 精品视频手机在线观看免费 | 高h全肉动漫在线观看免费 高h辣h双处全是肉军婚 | 成人欧美一区二区三区白人 | 嘉嘉的丝袜美腿白丝 | 成人午夜视频一区二区国语 | 含羞草传媒一天免费看下 | 男女肉粗暴进来下面好紧 | 成年人免费在线看 | 好骚好紧 | 色老板在线免费视频 | 国产一区二区三区在线观看视频 | 特级www| 范冰冰好紧好滑好湿 |