可能是一个奇怪的问题。但是我一直在摸不着为什么如果你想得到一个列表的长度,你不能简单地说list.len(),你必须将列表传递给len()来获得它的大小?这个len()实际来自哪里?
答案 0 :(得分:10)
你可以得到很多物品的长度。列表,词组,集合,其他集合。因此,在内部调用type(obj).__len__(obj)
的{{3}}会为您提供标准API来获取长度。
如果所有这些集合类型都有一个直接调用的len()
方法,则无法阻止某人创建使用例如自定义集合类的自定义集合类。 .length()
或.length
属性。
builtin len()
来自Python的创造者Guido van Rossum的解释:
首先,由于HCI的原因,我选择
len(x)
而不是x.len()
(def __len__()
来得更晚)。实际上有两个相互交织的原因,都是HCI:(a)对于某些操作,前缀表示法只读取比 postfix - prefix(和infix!)操作有着悠久的传统 数学,喜欢视觉效果帮助的符号 数学家思考问题。比较我们的简单方法 将
x*(a+b)
之类的公式重写为x*a + x*b
以使其笨拙 使用原始OO表示法做同样的事情。(b)当我阅读代码
len(x)
我知道它要求的时候 某事的长度。这告诉我两件事:结果是 整数,参数是某种容器。与此相反的, 当我阅读x.len()
时,我必须知道x是某种 容器实现接口或从类继承 有一个标准的len()
。见证我们偶尔会遇到的困惑 未实现映射的类具有get()
或keys()
方法或非文件的方法具有write()
方法。以另一种方式说同样的事情,我认为'len'是内置的 操作。我不想失去那个。我不能肯定地说你是否意味着,但是'def len(self):......'肯定听起来像你 想把它降级为普通的方法。我非常喜欢这个。
答案 1 :(得分:5)
它实际上来自__len__()
:
In [15]: lis=[1,2,3]
In [16]: lis.__len__()
Out[16]: 3
调用实现内置函数len()。 应该返回对象的长度,一个整数> = 0.另外,一个 没有定义非零()方法且 len ()的对象 方法返回零在布尔上下文中被视为false。