1 2 如何使用特殊方法

2022-05-21 17:54:08 字數 1698 閱讀 1974

如何使用特殊方法:

首先明確一點,特殊方法的存在是為了被 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 語言結構體。直接讀取這個值比呼叫乙個方法要快很多。

背後的原因是 cpython 會直 接從乙個 c 結構體裡讀取物件的長度,完全不會呼叫任何方法。獲取乙個集合中元素的數量是乙個很常見的操作,在 str、list、memoryview 等型別上,這個操作必須高效。 

很多時候,特殊方法的呼叫是隱式的,比如 for i in x: 這個語句, 背後其實用的是 iter(x),而這個函式的背後則是 x.__iter__() 方 法。當然前提是這個方法在 x 中被實現了。

通過內建的函式(例如 len、iter、str,等等)來使用特殊方法是最 好的選擇。這些內建函式不僅會呼叫特殊方法,通常還提供額外的好 處,而且對於內建的類來說,它們的速度更快。

不要自己想當然地隨意新增特殊方法,比如 __foo__ 之類的,因為雖然現在這個名字沒有被 python 內部使用,以後就不一定了。 

字串表示形式:

python 有乙個內建的函式叫 repr,它能把乙個物件用字串的形式表 達出來以便辨認,這就是「字串表示形式」。repr 就是通過 __repr__ 這個特殊方法來得到乙個物件的字串表示形式的。如果沒有實現 __repr__,當我們在控制台裡列印乙個向量的例項時,得到的字串可能會是 。 互動式控制台和除錯程式(debugger)用 repr 函式來獲取字串表示形式;在老的使用 % 符號的字串格式中,這個函式返回的結果用來代替 %r 所代表的物件;同樣,str.format 函式所用到的新式字串格式化語法也是利用了 repr,才把 !r 字段變成字串。

__repr__ 和 __str__ 的區別在於,後者是在 str() 函式被使用,或 是在用 print 函式列印乙個物件的時候才被呼叫的,並且它返回的字串對終端使用者更友好。

如果你只想實現這兩個特殊方法中的乙個,__repr__ 是更好的選擇, 因為如果乙個物件沒有 __str__ 函式,而 python 又需要呼叫它的時候,直譯器會用 __repr__ 作為替代。

自定義的布林值:

儘管 python 裡有 bool 型別,但實際上任何物件都可以用於需要布林值 的上下文中(比如 if 或 while 語句,或者 and、or 和 not 運算 符)。為了判定乙個值 x 為真還是為假,python 會呼叫 bool(x),這個 函式只能返回 true 或者 false。

預設情況下,我們自己定義的類的例項總被認為是真的,除非這個類對 __bool__ 或者 __len__ 函式有自己的實現。bool(x) 的背後是呼叫 x.__bool__() 的結果;如果不存在 __bool__ 方法,那麼 bool(x) 會 嘗試呼叫 x.__len__()。若返回 0,則 bool 會返回 false;否則返回 true

Python3 如何使用特殊方法

特殊方法的存在是為了被python直譯器呼叫的 首先明確一點,特殊方法的存在是為了被 python 直譯器呼叫的,你自己並不需要呼叫它們。也就是說沒有my object.len 這種寫法,而應該使用len my object 在執行len my object 的時候,如果my object是乙個自定...

第12 題(特殊方法求1 2 n)

第12 題 題目 求1 2 n,要求不能使用乘除法 for while if else switch case 等關鍵字以及條件判斷語句 a?b c 幾種思路 namespace ms100p 12 void display int add increasebyone 0 int add count...

如何在html中使用特殊字型

html中可以直接使用的字型很多,足以滿足我們大部分需求,但在一些特殊情況下,我們需要使用特殊的字型,本文介紹了如何在你的html網頁中使用特殊字型 不多bb,先上效果圖 接下來就教大家如何使用特殊字型 font face說明 以上的font family值為字型名,src的值為你的.ttf字型檔案...