[英]When will the Python special method (i.e. magic method) __len__ be called?
[英]The reason of foo.__x__ and x(foo) in Python (i.e. len and __len__)
直觀地, List
類應該實現一個屬性或方法來檢索實例的長度。 幸運的是,Python列表有一個名為__len__
的隱藏方法。 不幸的是,這種方法並不是直接使用的。 我應該使用一個外部函數來為我讀取隱藏的方法。
這就像我需要讓別人打開冰箱為我喝啤酒。 啤酒放在冰箱里,我有雙手,我應該能夠自己做。
從概念上講,這種方法似乎很奇怪。 為什么不使用屬性(而不是方法)來獲取列表的長度。
換句話說,我更喜歡使用foo.len
而不是foo.len()
或foo.__len__
。 len(foo)
對我來說更加奇怪。
這個實現有解釋嗎?
這個答案部分回答了我的問題,但我的挫敗感仍然存在。
對於摘要,這是因為它們可能與您想象的不那么密切相關。 只是談論你的帖子的len
與__len__
,但你可以在第一個鏈接中找到其他例子。
讓我們首先關注__len__
:
class Test1:
pass
class Test2:
def __bool__(self):
return False
class Test3:
def __len__(self):
return 0
t1 = Test1()
t2 = Test2()
t3 = Test3()
那么什么是評價t1
, t2
¹,和t3
在布爾上下文?
bool(t1)
為True
。 標准python行為,任何未明確為False
行為都被視為True
。 bool(t2)
是False
。 將對象顯式設置為False
會相應地表現。 bool(t3)
是False
。 由於t3
實現__len__
被認為是一個容器,因為它的長度是0
那么它是一個空的。 根據定義,在布爾上下文中,空容器被視為False
。 __len__
不一定只能被len
調用。
另一方面, len
為您提供擔保:
它將計算該容器中的元素數量。 無論它意味着什么依賴於容器:比較
s = "A string with 𐐐" d = s.encode("utf-8") print(len(s)) # outputs 15 print(len(d)) # outputs 18
因為s
是字符的容器, d
是字節的容器。
¹注意__bool__
是__nonzero__
在python2。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.