溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python自省機制的示例分析

發(fā)布時間:2021-11-25 17:35:32 來源:億速云 閱讀:148 作者:小新 欄目:開發(fā)技術

這篇文章將為大家詳細講解有關Python自省機制的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

    何為自省

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

    dir()函數

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

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

    執(zhí)行結果為:

    Python自省機制的示例分析

    上面的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))

    Python自省機制的示例分析

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

    執(zhí)行結果如下:

    Python自省機制的示例分析

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

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

    如果平時的開發(fā)中對模塊、類的操作比較多,那么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"))

    執(zhí)行結果為:

    Python自省機制的示例分析

    關于“Python自省機制的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

    向AI問一下細節(jié)

    免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI