我可以检查python列表或字典是否为空或不像这样
lis1, dict1 = [], {}
# similar thing can be done for dict1
if lis1:
# Do stuff
else:
print "List is empty"如果我试图用我的类对象来做这件事,即通过输入if my_object:来检查我的对象属性是否是非空的,这总是计算为True。
>>> class my_class(object):
... def __init__(self):
... self.lis1 = []
... self.dict1 = {}
...
>>> obj1 = my_class()
>>> obj1
<__main__.my_class object at 0x10c793250>
>>> if obj1:
... print "yes"
...
yes我可以专门编写一个函数来检查我的对象属性是否是非空的,然后调用if obj1.is_attributes_empty():,但我更感兴趣的是,if如何根据它们包含或为空的项将standard data-types (如list和dict )计算为True或False。
如果我想用类对象实现此功能,需要重写或更改哪些方法?
发布于 2015-09-29 05:35:51
您需要实现__nonzero__方法(或Python3的__bool__ )
class my_class(object):
def __init__(self):
self.lis1 = []
self.dict1 = {}
def __nonzero__(self):
return bool(self.lis1 or self.dict1)
obj = my_class()
if obj:
print "Available"
else:
print "Not available"Python还检查__len__方法的真实性,但这似乎对您的示例没有意义。
如果您有很多属性需要检查,您可能更愿意
return any((self.lis1, self.dict1, ...))发布于 2015-09-29 05:37:32
它是在Python2.x真值测试文档中给出的-
如果类定义
__nonzero__()或__len__()方法,则当该方法返回整数零或bool值False时,用户定义类的实例。
如果类定义
__bool__()或__len__()方法,则当该方法返回整数零或bool值False时,用户定义类的实例。
根据类的定义,如果定义__len__()方法(该方法返回列表长度和dict.Then )可能有意义,则将调用此方法以确定是在布尔上下文中将对象解释为True还是False。例子-
class my_class(object):
def __init__(self):
self.lis1 = []
self.dict1 = {}
def __len__(self):
print("In len")
return len(self.lis1) + len(self.dict1)演示-
>>> class my_class(object):
... def __init__(self):
... self.lis1 = []
... self.dict1 = {}
... def __len__(self):
... print("In len")
... return len(self.lis1) + len(self.dict1)
...
>>> obj = my_class()
>>> if obj:
... print("yes")
...
In len
>>> obj.lis1.append(1)
>>>
>>> if obj:
... print("yes")
...
In len
yes发布于 2022-09-02 11:12:36
vars()函数中的构建为检查对象是否有任何非空属性提供了一个有用的一行。将其与__nonzero__相结合,您将得到以下内容:
def __nonzero__(self):
return any(vars(self).values())https://stackoverflow.com/questions/32836291
复制相似问题