簡體   English   中英

Python中foo .__ x__和x(foo)的原因(即len和__len__)

[英]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)對我來說更加奇怪。

這個實現有解釋嗎?

這個答案部分回答了我的問題,但我的挫敗感仍然存在。

你可以找到一個深理由在這里和Guido的思想在這里

對於摘要,這是因為它們可能與您想象的不那么密切相關。 只是談論你的帖子的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()

那么什么是評價t1t2 ¹,和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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM