gpt4 book ai didi

python - Python 中 foo.__x__ 和 x(foo) 的原因(即 len 和 __len__)

转载 作者:太空宇宙 更新时间:2023-11-03 15:05:16 25 4
gpt4 key购买 nike

从直觉上讲,List 类应该实现一个属性或方法来检索实例的长度。幸运的是,Python 的列表有一个名为 __len__ 的隐藏方法。不幸的是,这种方法并不意味着可以直接使用。我应该改为使用一个外部函数来为我读取隐藏的方法。

这就像我需要请别人打开冰箱给我拿啤酒一样。啤酒在冰箱里,我有两只手,我应该能自己搞定。

从概念上讲,这种方法似乎很奇怪。为什么没有用于获取列表长度的属性(而不是方法)。

换句话说,我更喜欢使用 foo.len 而不是 foo.len()foo.__len__len(foo) 对我来说显得更奇怪。

这个实现有解释吗?

answer部分回答了我的问题,但我仍然感到沮丧。

最佳答案

你可以找到一个深刻的理由here和 Guido 的想法 here .

总而言之,这是因为它们可能并不像您想象的那样密切相关。只是谈论你帖子的 len__len__ 但你可以在第一个链接中找到其他示例。

让我们从关注 __len__ 开始:

class Test1:
pass

class Test2:
def __bool__(self):
return False

class Test3:
def __len__(self):
return 0

t1 = Test1()
t2 = Test2()
t3 = Test3()

现在 t1t2¹ 和 t3 在 bool 上下文中的计算结果是什么?

  • bool(t1)True。标准 python 行为,任何未明确 False 的内容都被视为 True
  • bool(t2)False。将对象显式设置为 False 会相应地表现。
  • bool(t3)False。因为 t3 implements __len__ 被认为是一个容器,并且因为它的长度是 0 所以它是一个空容器。根据定义,空容器在 bool 上下文中被视为 False

__len__ 不一定只能由 len 调用。

另一方面,

len 为您提供保证:

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

    s = "A string with 𐐐"
    d = s.encode("utf-8")
    print(len(s)) # outputs 15
    print(len(d)) # outputs 18

    因为s是字符的容器,d是字节的容器。


¹ 请注意 __bool__ 在 python2 中是 __nonzero__

关于python - Python 中 foo.__x__ 和 x(foo) 的原因(即 len 和 __len__),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33517845/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com