Python語言規範定義了很多 的所謂基礎協議,這些協議大都有内置實現,編程時我們可以不必太關注,但認識理解一下還是很有益處的,可以更有助于理解Python程序的底層邏輯。
前言
作為動态型解釋性高級編程語言的Python,其程序的執行時依賴解釋器的。解釋器就好比現在的翻譯軟件,負責把你編寫的程序代碼翻譯給機器所能理解的指令并執行。你所編寫的代碼必須隐式或顯式地遵循特定“翻譯軟件”的基本體系規範,否則就是雞鴨對話了——而Python中這些基本的體系規範,用術語表示就是“協議”(Protocol,或者簡單理解為接口規則或内置方法)就是這些基礎協議支撐起了Python的生态世界。
Python語言規範中基本協議類型很多,這些協議的實現往往都是C語言實現的,我們不需要查看源碼,但認識這些協議後,你将對程序的底層邏輯更清晰。
Python中的基本協議有對象協議、數字協議、比較協議、轉換協議、容器協議、叠代協議、屬性協議、函數協議、上下文管理協議等等。本文主要介紹對象協議:
對象協議對象(Object)是Python中所有類(Class)的基類,下表中為基本的對象協議(方法),始于與對象的整體管理有關,用以實現對象的創建、初始化、銷毀和表示。
下面分别概要介紹一下:
協議方法__new__()和__init__()通常是一起使用來創建和初始化實例。當通過調用SomeClass(args)創建對象時,它将被轉換為以下步驟:
x = SomeClass.__new__(SomeClass, args)
if isinstance(x, SomeClass):
x.__init__(args)
通常,這些步驟是在幕後處理的,不必太擔心。在類中實現的最常見方法是__init__()。使用__new__()時幾乎總是表明存在與實例創建相關的高級魔法(例如,在想要繞過__init__()的類方法中使用,或在某些創建設計模式中使用,如定義單例或緩存)。__new__()的實現不一定需要返回相關類的實例——如果不是,則後續調用在創建時跳過__init__()。
__del__()方法在實例即将被垃圾收集時被調用。此方法僅在實例不再使用時調用。需要注意的是,del x語句隻會減少實例引用計數,并不一定會導緻調用此函數(__del__())。除非實例需要在銷毀時執行額外的資源管理步驟,否則幾乎從不定義__del__()。
由内置的repr()函數調用的__repr__()方法創建對象的字符串表示形式,這對調試和結果輸出很有用。
這個方法還負責創建在交互解釋器中檢查變量時看到的值的輸出。約定是讓__repr__()返回一個表達式字符串,可以用eval()對其求值以重新創建對象。例如:
>>> a = [2, 3, 4, 5] # 創建列表哦
>>> s = repr(a) #s='[2, 3, 4, 5]'
>>> b = eval(s)
>>> b
[2, 3, 4, 5]
如果不能創建簡單的字符串表達式,則約定由__repr__()返回該形式的字符串
<...message...>,如下所示:
>>> f =open('D:\\tmp\\testx.txt')
>>> a = repr(f)
>>> a
"<_io.TextIOWrapper name='D:\\\\tmp\\\\testx.txt' mode='r' encoding='cp936'>"
>>>
更多對象協議要想查看多想更多的其它“協議方法”,你可以在IDLE shell下輸入如下内容看看:
>>> dir(object)# 回車後顯示内容如下:
對象object内置的協議(方法)
dir是Python内置的一個函數,可以快捷的查看相關方法或類的說明描述。對象夠的其它方法這裡就不一一解釋了。可以在shell下輸入如下形式的函數來查看相應的方法描述:
help(object.__xxx__)# xxx就是上述引号的内容。
最後本篇就介紹這些了。下次内容接續介紹Python相關内置的規範——其它的協議方法。
點個贊,分享出去吧。謝謝,下次再見~
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!