【问题标题】:What operation is called on A in "while A:"?在“while A:”中对 A 调用了什么操作?
【发布时间】:2016-11-22 17:56:34
【问题描述】:

假设我有:

class Bar:
    pass
A = Bar()

while A:
    print("Foo!")

然后在A 上调用什么操作以确定while 循环?

我尝试过__eq__,但效果不大。

【问题讨论】:

  • 我认为 A 是对 Bar 实例的引用,因此不是 False。
  • bool(A) 我想...

标签: python python-3.x class while-loop operation


【解决方案1】:

用户定义的对象是真实的,除非你定义了一个自定义的__bool__

>>> class A:
...     pass
...
>>> a = A()
>>> if a: print(1)
...
1
>>> class B:
...     def __bool__(self):
...         return False
...
>>> b = B()
>>> if b: print(1)
...
>>>

【讨论】:

  • @richard - 无法理解代码不是编辑它的适当理由。这些“令人困惑且无关紧要的人字形、省略号”来自交互式口译会话。
  • 我也使用过 ipython。我还看到我的学生用人字形打字。
  • @richard - 该问题被明确标记为 Python 3,并包含 Python 3 风格的 print() 调用(在技术上适用于 Python 2,但更有可能出现在 Python 3 中) .
  • 关于那个 print 调用没有任何非 python2 的东西,我在评论中添加了帮助我之后的任何人,而不是开始争论。
【解决方案2】:

while statementwhile 关键字后跟一个表达式组成。

expression is used in a control flow statement 通过调用对象 __bool__ 方法评估该表达式的真值时:

在布尔运算的上下文中,以及当控制流语句使用表达式时,以下值被解释为假:FalseNone、所有类型的数字零、以及空字符串和容器(包括字符串、元组、列表、字典、集合和frozensets)。 所有其他值都被解释为真。 用户定义的对象可以通过提供__bool__()方法来自定义它们的真值。

简而言之,结果取决于你的对象的__bool__ 返回什么;由于您没有指定,因此使用默认值True

【讨论】:

    【解决方案3】:

    可以调用不同的方法来确定对象的计算结果是True 还是False

    如果定义了__bool__-方法,则调用此方法,否则,如果定义了__len__,则将其结果与0进行比较。

    【讨论】:

      猜你喜欢
      • 2017-11-13
      • 2019-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多