【问题标题】:Assign class boolean value in Python在 Python 中分配类布尔值
【发布时间】:2012-04-04 23:37:27
【问题描述】:

Python 中的 If 语句允许您执行以下操作:

   if not x:
       print "X is false."

如果您使用的是空列表、空字典、None、0 等,这可以工作,但是如果您有自己的自定义类怎么办?你可以为那个类分配一个 false 值,以便在相同的条件样式中,它会返回 false 吗?

【问题讨论】:

    标签: python class conditional-statements


    【解决方案1】:

    你需要在你的类上实现__nonzero__ 方法。这应该返回 True 或 False 以确定真值:

    class MyClass(object):
        def __init__(self, val):
            self.val = val
        def __nonzero__(self):
            return self.val != 0  #This is an example, you can use any condition
    
    x = MyClass(0)
    if not x:
        print 'x is false'
    

    如果尚未定义__nonzero__,则实现将调用__len__,并且如果实例返回非零值,则该实例将被视为True。如果__len__ 也未定义,则所有实例都将被视为True。

    在 Python 3 中,使用 __bool__ 代替 __nonzero__

    【讨论】:

    • 请注意,在 Python 3 中它是 __bool__
    • @delnan:谢谢,已添加到我的答案中。
    • 这只有在我有 () 的情况下才有效吗?我希望有一种方法可以工作,无论该项目是空列表、0 还是我的对象的实例是错误的。这个类的成员,整数,字符串等,都将在一个列表中。我需要一种方法来普遍测试它们中的任何一个是否为假。
    • @Kelketek:我稍微充实了这个例子。无需将() 放在任何地方,它就像列表和数字一样。
    【解决方案2】:
    class Foo:
         def __nonzero__(self): return False
         __bool__ = __nonzero__ # this is for python3
    
    In [254]: if Foo():
       .....:     print 'Yeah'
       .....: else: print 'Nay'
       .....:
    Nay
    

    或者,如果你想要超便携,你可以只定义__len__,这在两种语言中都有相同的效果,但它有一个(潜在的)缺点,它意味着你的对象有一个有意义的度量长度(它可能不会)。

    这适用于任何实例,具体取决于您在方法中放置的实际逻辑。

    【讨论】:

    • “这意味着你的对象有一个有意义的长度度量”,这里是关于语义的真正智慧之词。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-17
    • 1970-01-01
    • 2016-11-12
    • 2022-07-26
    • 2017-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多