特殊方法的存在是為了被python
直譯器呼叫的
首先明確一點,特殊方法的存在是為了被 python 直譯器呼叫的,你自己並不需要呼叫它們。也就是說沒有my_object.__len__()
這種寫法,而應該使用len(my_object)
。在執行len(my_object)
的時候,如果my_object
是乙個自定義類的物件,那麼 python 會自己去呼叫其中由你實現的__len__
方法。
然而如果是 python 內建的型別,比如列表(list
)、字串(str
)、位元組序列(bytearray
)等,那麼 cpython 會抄個近路,__len__
實際上會直接返回pyvarobject
裡的ob_size
屬性。pyvarobject
是表示記憶體中長度可變的內建物件的 c 語言結構體。直接讀取這個值比呼叫乙個方法要快很多。
很多時候,特殊方法的呼叫是隱式的,比如for i in x:
這個語句,背後其實用的是iter(x)
,而這個函式的背後則是x.__iter__()
方法。當然前提是這個方法在 x 中被實現了。
通常你的**無需直接使用特殊方法。除非有大量的元程式設計存在,直接呼叫特殊方法的頻率應該遠遠低於你去實現它們的次數。唯一的例外可能是 __init__
方法,你的**裡可能經常會用到它,目的是在你自己的子類的__init__
方法中呼叫超類的構造器。
通過內建的函式(例如len、iter、str
,等等)來使用特殊方法是最好的選擇。這些內建函式不僅會呼叫特殊方法,通常還提供額外的好處,而且對於內建的類來說,它們的速度更快。14.12 節中有詳細的例子。
不要自己想當然地隨意新增特殊方法,比如__foo__
之類的,因為雖然現在這個名字沒有被 python 內部使用,以後就不一定了。
5868037 qq號
[email protected] qq郵箱
python3 特殊函式 call
call 的本質是將乙個類變成乙個函式 使這個類的例項可以像函式一樣呼叫 例1 class person object def init self,name,gender self.name name self.gender gender def call self,friend print my ...
python3使用 python3使用模組
python內建了很多非常有用的模組,只要安裝完畢,這些模組就可以立刻使用。我們以內建的sys模組為例,編寫乙個hello的模組 usr bin env python3 coding utf 8 a test module author michael liao import sys def tes...
Python3如何使用tabulate列印資料
需要先安裝 tabulate 模組 pi azacmcinstall 以上是把一維的dict列印出來.再看看二維的,list of dict 注 此處project函式是funcy包中的乙個功能 output 漂亮 另外,之前也用過 prettytable 但是感覺沒有tabulate簡單上手 本文...