在 Python 中分配类布尔值
Posted
技术标签:
【中文标题】在 Python 中分配类布尔值【英文标题】:Assign class boolean value in Python 【发布时间】:2012-04-04 23:37:27 【问题描述】:Python 中的 If 语句允许您执行以下操作:
if not x:
print "X is false."
如果您使用的是空列表、空字典、None、0 等,这可以工作,但是如果您有自己的自定义类怎么办?你可以为那个类分配一个 false 值,以便在相同的条件样式中,它会返回 false 吗?
【问题讨论】:
【参考方案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__
,这在两种语言中都有相同的效果,但它有一个(潜在的)缺点,它意味着你的对象有一个有意义的度量长度(它可能不会)。
这适用于任何实例,具体取决于您在方法中放置的实际逻辑。
【讨论】:
“这意味着你的对象有一个有意义的长度度量”,这里是关于语义的真正智慧之词。以上是关于在 Python 中分配类布尔值的主要内容,如果未能解决你的问题,请参考以下文章