可能是个奇怪的问题。但是我一直在摸索,为什么如果你想得到一个列表的长度,你不能简单地说 list.len() 并且你必须将列表传递给 len() 来获得它的大小?这个 len() 实际上是从哪里来的?
2 回答
你可以得到很多项目的长度。列表、字典、集合、其他集合。因此,内部调用的内置len()
type(obj).__len__(obj)
函数为您提供了一个标准 API 来获取长度。
如果所有这些集合类型都有一个len()
直接调用的方法,那么没有什么可以阻止某人创建使用例如.length()
或.length
属性的自定义集合类。
以下是 Python 的创造者 Guido van Rossum 的解释:
首先,我出于 HCI 的原因选择
len(x)
了(来晚得多)。实际上有两个相互交织的原因,都是 HCI:x.len()
def __len__()
(a) 对于某些运算,前缀符号比后缀读起来更好——前缀(和中缀!)运算在数学中有着悠久的传统,它喜欢视觉帮助数学家思考问题的符号。将我们重写公式的简单性与使用原始 OO 表示法做同样事情的笨拙进行比较
x*(a+b)
。x*a + x*b
(b) When I read code that says
len(x)
I know that it is asking for the length of something. This tells me two things: the result is an integer, and the argument is some kind of container. To the contrary, when I readx.len()
, I have to already know that x is some kind of container implementing an interface or inheriting from a class that has a standardlen()
. Witness the confusion we occasionally have when a class that is not implementing a mapping has aget()
orkeys()
method, or something that isn't a file has awrite()
method.Saying the same thing in another way, I see 'len' as a built-in operation. I'd hate to lose that. I can't say for sure whether you meant that or not, but 'def len(self): ...' certainly sounds like you want to demote it to an ordinary method. I'm strongly -1 on that.
它实际上来自__len__()
:
In [15]: lis=[1,2,3]
In [16]: lis.__len__()
Out[16]: 3
调用以实现内置函数 len()。应返回对象的长度,整数 >= 0。此外,未定义非零() 方法且其len () 方法返回零的对象在布尔上下文中被认为是假的。