2015-11-04 22 views
3

直觀上,List類應該實現一個屬性或方法來檢索實例的長度。幸運的是Python'lists有一個叫做__len__的隱藏方法。不幸的是,這種方法並不是直接使用。我應該使用一個外部函數來爲我讀取隱藏的方法。Python中foo .__ x__和x(foo)的原因(即len和__len__)

這就像我需要問別人打開冰箱爲我搶啤酒。啤酒在冰箱裏,我有雙手,我應該可以自己做。

從概念上講,這種方法似乎很好奇。爲什麼不有一個屬性(而不是一個方法)來獲取列表的長度。

換句話說,我寧願使用foo.len而不是foo.len()foo.__len__len(foo)對我來說顯得更加古怪。

對此實現有解釋嗎?

這個answer部分回答了我的問題,但我的沮喪依然存在。

+1

[This](http://effbot.org/pyfaq/why-does-python-use-methods-for-some-functionality-eg-list-index-but-functions-for-other-eg-len -list.htm)可能值得閱讀。 –

+1

以及[this one](http://lucumr.pocoo.org/2011/7/9/python-and-pola/)(花費一些時間再次查找)。 –

+0

@MathiasEttinger這兩篇文章回答了我的問題。我理解背後的哲學,我必須處理它。 – nowox

回答

4

你可以找到一個深刻的理由here和圭多的想法here

總結,這是因爲它們可能不像您想象的那樣密切相關。只是在討論您的帖子的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在布爾環境評價:通過專注於__len__

讓我們開始?

  • bool(t1)True。標準的python行爲,任何不明確的False被認爲是True
  • bool(t2)False。明確地將對象設置爲False的行爲相應。
  • bool(t3)False。由於t3 implements __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__在python2 __nonzero__

相關問題