2012-11-12 68 views
4

可能是一個奇怪的問題。但我一直在抓我的頭了,爲什麼,如果你想讓你不能簡單地說list.len()列表的長度,你必須通過列表LEN()來獲得它的大小?這個len()實際上是從哪裏來的?爲什麼len(list)而不是list.len()在python中?

+0

可能重複[是否有原因Python字符串沒有字符串長度的方法?](http://stackoverflow.com/questions/237128/is-there-a-reason-python-strings- dont-have-a-string-length-method) –

回答

10

你可以得到很多物品的長度。列表,字典,集合,其他集合。所以調用type(obj).__len__(obj)內爲您提供了一個標準的API來獲取長度builtin len()

如果這些集合類型有len()方法被稱爲直接就什麼也沒有,以防止有人創建使用例如自定義集合類.length().length財產。

Here's從吉多·範羅蘇姆,巨蟒的創作者的解釋:

所有的

首先,我選擇了len(x)x.len() HCI原因(def __len__()來得更高版本)。有兩種相互交織的原因實際上,兩個HCI:

(一)對於某些操作,前綴符號只是讀取比 後綴更好 - 前綴操作具有悠久的傳統 其中的數學符號喜歡的地方(和中綴!)視覺效果幫助數學家思考一個問題。比較將x*(a+b)這樣的公式重寫爲x*a + x*b的難易程度與 的笨拙效果使用原始OO符號做同樣的事情。

(b)當我閱讀代碼,說len(x)知道這是要求 的東西的長度。這告訴我兩件事:結果是一個 整數,並且參數是某種容器。相反, 當我讀x.len()時,我必須已經知道x是某種實現接口的容器或繼承自 標準的len()的類。見證我們偶爾產生的困惑, 一個沒有實現映射的類有一個get()keys() 方法,或者某個不是文件的東西有一個write()方法。

用另一種方式說同樣的事情,我看到'len'作爲內置的 操作。我不想失去那個。我不能肯定你的意思,不過,'def len(self):...'當然聽起來像你 想要降級到一個普通的方法。我強烈的-1。

+0

使用len(obj)而不是對象屬性'length'對我來說聽起來更像Pythonian,它在朗讀時甚至是有意義的。 – 2012-11-12 13:44:24

5

它實際上來自__len__()

In [15]: lis=[1,2,3] 

In [16]: lis.__len__() 
Out[16]: 3 

object.__len__(self):

調用來實現內置函數len()。 應該返回該對象的長度的整數,> = 0。此外,一個 對象不限定非零()方法,並且其len個() 方法返回零被認爲是在假布爾上下文。

相關問題