Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中foo.uuux_uuuu和x(foo)的原因(即len和uuuu len_uuu)_Python_Python Internals - Fatal编程技术网

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)
    True
    。在标准python行为中,任何不显式
    False
    的行为都被视为
    True
  • bool(t2)
    False
    。将对象显式设置为
    False
    会相应地起作用
  • bool(t3)
    False
    。由于
    t3
    实现了
    \uu len\uu
    被视为一个容器,并且由于其长度为
    0
    ,因此它是一个空容器。根据定义,在布尔上下文中,空容器被视为
    False
\uuuu len\uuu
不一定只能由
len
调用

另一方面,
len
为您提供了以下保障:

  • 它将返回一个正整数
  • 它将适用于任何容器,而不仅仅是列表
  • 它将计算该容器中的元素数。不管它意味着什么,都取决于容器:比较


    s=“带的字符串可能值得一读。以及(花了一些时间重新查找)。@MathiasEttinger这两篇文章都回答了我的问题。我理解背后的哲学,我必须处理它。