假设我有一个列表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;
}
}
方法吗?
答案 0 :(得分:3)
在Python 3.x中,它是__bool__
或__len__
:
<强>
object.__bool__(self)
强>被要求实施真值测试和内置操作
bool()
;应该返回False
或True
。当这种方法不是 如果已定义,则调用__len__()
,对象为 如果结果非零,则认为是真的。如果一个类都没有定义__len__()
或__bool__()
,其所有实例都被视为真实。
在2.x中,它被命名为__nonzero__
;见what's new in 3.0。
答案 1 :(得分:0)
可以测试任何对象的真值,以便在
if
或while
条件下使用,或者作为下面布尔运算的操作数。以下值被视为false:
- (...)
- 任何空序列,例如
''
,()
,[]
。- (...)
- 用户定义类的实例,如果类定义
__bool__()
或__len__()
方法,则该方法返回整数零或bool
值False
。 [有关这些特殊方法的更多信息,请参阅Python参考手册(Basic customization)。]所有其他值都被认为是真的 - 因此许多类型的对象始终为真。
具有布尔结果的操作和内置函数始终返回
0
或False
表示false,1
或True
表示true,除非另有说明。 (重要的例外:布尔运算or
和and
总是返回其中一个操作数。)
答案 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__
确实被调用了。