在验证集合时调用的方法

时间:2017-04-30 16:18:53

标签: python

假设我有一个列表while Q: do_something() Q.pop() 。在以下代码中:

while Q

Q语句中,调用了列表__len__的哪种方法?是IEnumerable<TreeNode> Collect(TreeNodeCollection nodes) { foreach(TreeNode node in nodes) { yield return node; foreach (var child in Collect(node.Nodes)) yield return child; } } 方法吗?

3 个答案:

答案 0 :(得分:3)

在Python 3.x中,它是__bool____len__

  

<强> object.__bool__(self)

     

被要求实施真值测试和内置操作   bool();应该返回FalseTrue。当这种方法不是   如果已定义,则调用__len__(),对象为   如果结果非零,则认为是真的。如果一个类都没有定义   __len__()__bool__(),其所有实例都被视为真实。

在2.x中,它被命名为__nonzero__;见what's new in 3.0

答案 1 :(得分:0)

来自python's documentation

  

可以测试任何对象的真值,以便在ifwhile条件下使用,或者作为下面布尔运算的操作数。以下值被视为false:

     
      
  • (...)
  •   
  • 任何空序列,例如''()[]
  •   
  • (...)
  •   
  • 用户定义类的实例,如果类定义__bool__()__len__()方法,则该方法返回整数零或boolFalse。 [有关这些特殊方法的更多信息,请参阅Python参考手册(Basic customization)。]
  •   
     

所有其他值都被认为是真的 - 因此许多类型的对象始终为真。

     

具有布尔结果的操作和内置函数始终返回0False表示false,1True表示true,除非另有说明。 (重要的例外:布尔运算orand总是返回其中一个操作数。)

答案 2 :(得分:0)

是的,在这种情况下会调用__len__

让我们看一下这段代码:

class clist(list):

    def __len__(self):
        print "Called"

Q = clist([1,2,3,4])

while Q:
    break

输出:

Called
Traceback (most recent call last):
  File "a.py", line 10, in <module>
    while Q:
TypeError: an integer is required

但是,如果我删除该方法,

class clist(list):
    pass

Q = clist([1,2,3,4])

while Q:
    break    

代码运行得很好,但不会打印任何东西。

是的,__len__确实被调用了。