首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >len()和.__len__()有什么区别?

len()和.__len__()有什么区别?
EN

Stack Overflow用户
提问于 2010-03-20 08:53:24
回答 4查看 103.1K关注 0票数 131

调用len([1,2,3])[1,2,3].__len__()有什么区别吗?

如果没有明显的区别,那么在幕后有什么不同的做法呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-03-20 08:57:02

len是一个获取集合长度的函数。它通过调用对象的__len__方法来工作。__something__属性很特殊,通常看起来很复杂,通常不应该直接调用。

在很久以前的某个时刻,人们就已经决定,获取某个东西的长度应该是一个函数,而不是一个方法代码,因为len(a)的含义对初学者来说是很清楚的,但a.len()就不那么清楚了。当Python开始的时候,__len__甚至还不存在,而len是一个可以处理几种类型对象的特殊东西。无论这种情况是否完全有意义,它都会一直存在。

票数 127
EN

Stack Overflow用户

发布于 2010-03-20 09:02:20

您可以认为len()大致等同于

代码语言:javascript
运行
复制
def len(x):
    return x.__len__()

它的一个优点是,它允许您编写如下内容

代码语言:javascript
运行
复制
somelist = [[1], [2, 3], [4, 5, 6]]
map(len, somelist) 

而不是

代码语言:javascript
运行
复制
map(list.__len__, somelist)

代码语言:javascript
运行
复制
map(operator.methodcaller('__len__'), somelist)

不过,两者的行为略有不同。例如,在in的情况下

代码语言:javascript
运行
复制
>>> (1).__len__()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'int' object has no attribute '__len__'
>>> len(1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: object of type 'int' has no len()
票数 30
EN

Stack Overflow用户

发布于 2015-02-18 17:23:48

你可以查看Pythond docs

代码语言:javascript
运行
复制
>>> class Meta(type):
...    def __getattribute__(*args):
...       print "Metaclass getattribute invoked"
...       return type.__getattribute__(*args)
...
>>> class C(object):
...     __metaclass__ = Meta
...     def __len__(self):
...         return 10
...     def __getattribute__(*args):
...         print "Class getattribute invoked"
...         return object.__getattribute__(*args)
...
>>> c = C()
>>> c.__len__()                 # Explicit lookup via instance
Class getattribute invoked
10
>>> type(c).__len__(c)          # Explicit lookup via type
Metaclass getattribute invoked
10
>>> len(c)                      # Implicit lookup
10
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2481421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档