Python中foo.uuux_uuuu和x(foo)的原因(即len和uuuu len_uuu)
直观地说,Python中foo.uuux_uuuu和x(foo)的原因(即len和uuuu len_uuu),python,python-internals,Python,Python Internals,直观地说,List类应该实现一个属性或方法来检索实例的长度。幸运的是,Python的列表中有一个名为\uu\len\uu的隐藏方法。不幸的是,这种方法并不打算直接使用。我应该使用一个外部函数来读取隐藏的方法 就像我需要请别人打开冰箱帮我拿啤酒一样。啤酒在冰箱里,我有双手,我应该可以自己动手 从概念上讲,这种方法似乎很奇怪。为什么不使用属性(而不是方法)来获取列表的长度 换句话说,我更喜欢使用foo.len而不是foo.len()或foo.\uuuu len\uuuulen(foo)在我看来更奇怪
List
类应该实现一个属性或方法来检索实例的长度。幸运的是,Python的列表中有一个名为\uu\len\uu
的隐藏方法。不幸的是,这种方法并不打算直接使用。我应该使用一个外部函数来读取隐藏的方法
就像我需要请别人打开冰箱帮我拿啤酒一样。啤酒在冰箱里,我有双手,我应该可以自己动手
从概念上讲,这种方法似乎很奇怪。为什么不使用属性(而不是方法)来获取列表的长度
换句话说,我更喜欢使用foo.len
而不是foo.len()
或foo.\uuuu len\uuuu
len(foo)
在我看来更奇怪
对这种实现有什么解释吗
这部分回答了我的问题,但我仍然感到沮丧 你可以找到一个深刻的理由和Guido的想法 总而言之,这是因为它们可能不像你想象的那样密切相关。仅讨论你文章中的
len
与\uuu len\uuu
,但你可以在第一个链接中找到其他例子
让我们首先关注\uuu len\uuu
:
class Test1:
pass
class Test2:
def __bool__(self):
return False
class Test3:
def __len__(self):
return 0
t1 = Test1()
t2 = Test2()
t3 = Test3()
现在,在布尔上下文中,t1
、t2
和t3
的计算是什么
为bool(t1)
。在标准python行为中,任何不显式True
的行为都被视为False
True
为bool(t2)
。将对象显式设置为False
会相应地起作用False
为bool(t3)
。由于False
实现了t3
被视为一个容器,并且由于其长度为\uu len\uu
,因此它是一个空容器。根据定义,在布尔上下文中,空容器被视为0
False
\uuuu len\uuu
不一定只能由len
调用
另一方面,len
为您提供了以下保障:
- 它将返回一个正整数李>
- 它将适用于任何容器,而不仅仅是列表李>
- 它将计算该容器中的元素数。不管它意味着什么,都取决于容器:比较
s=“带的字符串可能值得一读。以及(花了一些时间重新查找)。@MathiasEttinger这两篇文章都回答了我的问题。我理解背后的哲学,我必须处理它。