首頁 > 軟體

Python強大的自省機制詳解

2021-11-25 19:01:56

何為自省

在計算機程式設計領域裡,自省是一種能力,是通過一定機制在程式執行時獲知物件的型別及物件的內部結構,Python的自省能力還是很強大的,因為Python中一切皆物件,我們不僅可以獲取物件的型別,還可以獲取物件內部的屬性。下面就來介紹一下Python中一些提供強大自省能力的方法。

dir()函數

它是用於自省的最重要的函數之一。它以列表的形式返回一個物件所擁有的全部屬性和方法,如果dir()不傳任何引數,預設是查詢當前名稱空間有什麼物件。

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

執行結果為:

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

type()函數和id()函數

type()函數返回一個物件的型別。例如:

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

id()函數返回物件的唯一識別符號,是一個整數,在CPython中id()函數用於獲取物件的記憶體地址。例如:

print(id('tigeriaf')) 

# 結果輸出為 51064768

inspect模組

inspect是Python的標準庫,提供了更加強大的自省能力,提供了很多函數幫助獲取物件的資訊,例如模組、類、方法、函數、回溯、幀物件以及程式碼物件。
該模組提供了4種主要的功能:型別檢查、獲取原始碼、檢查類與函數、檢查直譯器的呼叫堆疊。下面介紹一下其中的幾個常用的方法:

getmembers(object, predicate=None)函數

是基於dir()實現的,返回一個包含物件的所有成員的(name, value)列表。返回的內容比物件的__dict__包含的內容多。predicate是可選的引數,被此函數判斷為True的成員才被返回。

例如:

import inspect
print(inspect.getmembers(list))

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

將返回一個inspect.Signature型別的物件,值為這個函數的所有引數。

getmodule(object)函數

返回定義物件的模組。

getsource(object)函數

返回物件的原始碼。

getsourcelines(object)函數

返回一個元組,元組第一項為物件原始碼行的列表,第二項是第一行原始碼的行號。 例如:

import inspect
def test(a: int):
    print(a)
print(inspect.signature(test))
print(inspect.getmodule(test))
print(inspect.getsource(test))
print(inspect.getsourcelines(test))

執行結果如下:

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

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

如果平時的開發中對模組、類的操作比較多,那麼inspect模組一定要學習一下。

hasattr()函數和getattr()函數

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

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"))

執行結果為:

總結

其實Python對自省有著很大的支援,Python中還有很多這裡沒提到的其他方法也能有助於自省,有興趣的話,你會慢慢發現它們的。

本篇文章就到這裡了,希望能夠給你帶來幫助,也希望您能夠多多關注it145.com的更多內容!


IT145.com E-mail:sddin#qq.com