首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查对象属性是否为非空python

检查对象属性是否为非空python
EN

Stack Overflow用户
提问于 2015-09-29 05:29:23
回答 7查看 10.7K关注 0票数 7

我可以检查python列表或字典是否为空或不像这样

代码语言:javascript
复制
lis1, dict1 = [], {}
# similar thing can be done for dict1
if lis1:
    # Do stuff
else:
    print "List is empty"

如果我试图用我的类对象来做这件事,即通过输入if my_object:来检查我的对象属性是否是非空的,这总是计算为True

代码语言:javascript
复制
>>> 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 (如listdict )计算为TrueFalse

如果我想用类对象实现此功能,需要重写或更改哪些方法?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2015-09-29 05:35:51

您需要实现__nonzero__方法(或Python3的__bool__ )

非零

代码语言:javascript
复制
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__方法的真实性,但这似乎对您的示例没有意义。

如果您有很多属性需要检查,您可能更愿意

代码语言:javascript
复制
return any((self.lis1, self.dict1, ...))
票数 7
EN

Stack Overflow用户

发布于 2015-09-29 05:37:32

它是在Python2.x真值测试文档中给出的-

如果类定义__nonzero__()__len__()方法,则当该方法返回整数零或bool值False时,用户定义类的实例。

对于Python 3.x -

如果类定义__bool__()__len__()方法,则当该方法返回整数零或bool值False时,用户定义类的实例。

根据类的定义,如果定义__len__()方法(该方法返回列表长度和dict.Then )可能有意义,则将调用此方法以确定是在布尔上下文中将对象解释为True还是False。例子-

代码语言:javascript
复制
class my_class(object):
    def __init__(self):
        self.lis1 = []
        self.dict1 = {}
    def __len__(self):
        print("In len")
        return len(self.lis1) + len(self.dict1)

演示-

代码语言:javascript
复制
>>> 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
票数 2
EN

Stack Overflow用户

发布于 2022-09-02 11:12:36

vars()函数中的构建为检查对象是否有任何非空属性提供了一个有用的一行。将其与__nonzero__相结合,您将得到以下内容:

代码语言:javascript
复制
def __nonzero__(self):
    return any(vars(self).values())
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32836291

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档