【问题标题】:Digging deeper into python if statements [duplicate]深入研究python if语句[重复]
【发布时间】:2021-01-07 14:40:09
【问题描述】:

这可能是一个非常愚蠢的问题,但我无法在其他任何地方找到答案,我看过 SO,但我找不到与我的问题相关的任何内容。

问题:

在python中,不知道其他语言,每当我们为内置类调用if语句时,它都会返回if语句解释的东西,例如,

a = 0
if a: print("Hello World")

上面的语句没有打印任何内容,因为if aFalse。现在哪个方法返回它是False,或者是否有 if 语句调用的方法以便知道它??

或者更确切地说,if 语句在 python 中是如何工作的?

【问题讨论】:

标签: python python-3.x python-2.x


【解决方案1】:

对象具有__bool__ 方法,当需要将对象视为布尔值时调用这些方法。你可以通过一个简单的测试看到:

class Test:
    def __bool__(self):
        print("Bool called")
        return False

t = Test()
if t:   # Prints "Bool Called"
    pass

bool(0) 给出False,所以0 被认为是一个“假”值。

一个类也可以also be considered to be truthy or falsey based on it's reported length

class Test:
    def __len__(self):
        print("Len called")
        return 0

t = Test()
if t:
    pass

【讨论】:

  • 只是从basic customization添加一些附加信息object.__bool__(self):调用以实现真值测试和内置操作bool();应该返回FalseTrue。如果未定义此方法,则调用__len__()(如果已定义),并且如果对象的结果为非零,则该对象被视为真。如果一个类既没有定义__len__() 也没有定义__bool__(),那么它的所有实例都被认为是真的。
  • @buran 谢谢,我总是忘记这一点。这是一个奇怪的决定。如果您希望它由长度决定,为什么不直接写一个__bool__ 并检查len?将其硬编码到语言中似乎很奇怪。
  • 感谢您的快速回复,但该问题已被标记为重复,我无法找到正确的搜索词,这可能是问题所在。不过谢谢
【解决方案2】:

好问题!这与if 语句无关。相反,它是对象本身。

如果一个对象定义了内置方法__bool__,它可以决定它是“真”还是“假”(也就是返回true还是false)。

更多详情见this回复,或官方Python docs


下面是一个 Dog 类的简单示例,如果它没有名称,则为 False

class Dog:
    def __init__(self, name):
        this.name = name

    def __bool__(self):
        return this.name != ""

dog1 = Dog("")
dog2 = Dog("Foo")
if (dog1): print("dog1")
if (dog2): print("dog2")
> dog2

【讨论】:

    【解决方案3】:

    在 Python 中,布尔值(if-else 条件的结果)通常被解释为整数 0 和 1。0 为 False,1 为 True。

    在您的情况下,您将 a 的值分配为 0,python 将其解释为 False,因此它没有打印任何内容。

    Python 中的一个简单规则是,空容器(list、dict、set、tuple、str)或 None 或 Number (int/float) 为 0 将被视为 False。任何大于 0 或 0.0000 等的数字都将被视为 True。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-02
      • 2011-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-05
      • 1970-01-01
      相关资源
      最近更新 更多