如何检查对象的值是否为真?

时间:2015-03-26 17:17:48

标签: python oop

所以我在从这个类实例化的对象数组中有一个对象:

class entity:
    def __init__(self,name):
        self.entity = self
        person = True
        plant = False
        self.name = name

我想要一个if语句,说明与下面的psudocode相同的东西:

for i in index:
    if i.property (let's say plant for instance) == True:
        print (the name of the value, ie plant)

当if语句对属性求值为true时,而不是打印" True"它将打印" plant"。我怎么会这样做,考虑到i.property显然是错误的,我不知道如何引用对象名称的价值?

3 个答案:

答案 0 :(得分:1)

使用内置vars,它返回对象的属性和值的字典:

>>> x = Entity('foo')
>>> vars(x)
{'entity': <__main__.Entity instance at 0x7fed7788b368>, 'name': 'foo'}  

所以,

for prop, val in vars(x).iteritems():
    if val is True:
        print prop

请注意,原始代码中personplant__init__中的局部变量,不会作为实体的属性附加。

答案 1 :(得分:0)

如果我理解正确,您要打印所有属性名称 给定对象的True

这可以使用:

完成
  

<强> DIR([对象])

     

不带参数,返回当前本地范围内的名称列表。使用参数,尝试返回该对象的有效属性列表。   ..

(见:https://docs.python.org/2/library/functions.html?highlight=dir#dir

返回可从给定对象访问的所有属性的列表。

>>> class entity:
...     def __init__(self,name):
...         self.entity = self
...         person = False
...         plant = False
...         self.name = name
... 
>>> e = entity('x')
>>> dir(e)
['__doc__', '__init__', '__module__', 'entity', 'name']

因此,您可以使用以下代码打印所有True属性:

>>> # no attribute is True, so none is printed
>>> for attribute in dir(e):
...     if getattr(e, attribute) is True:
...         print '"%s" is True' % (attribute, )
... 
>>> e.person = True
>>> for attribute in dir(e):
...     if getattr(e, attribute) is True:
...         print '"%s" is True' % (attribute, )
... 
"person" is True
>>> 

请注意,我正在使用is True表示该值必须字面上为True,而不是True 只评估为1(例如"non-empty string"entity等)。

根据评论进行编辑:

我不理解您的担忧 - 班级__init__的{​​{1}}方法集 personplantFalse。因此entity类的每个实例 没有 True值。无论你作为name通过什么,没有 明确地将某些属性更改为True,将永远不会有任何属性 具有True值的属性。

但我很可能不明白你的意图。

答案 2 :(得分:0)

entity个对象的更丰富的定义可能是:

class entity(object):

    def __init__(self, name, person=False, plant=False):
        self.person = person
        self.plant = plant
        self.name = name

    def __repr__(self):
        return "entity({0!r})".format(self.name)

然后给出一组实体,你可以很容易地迭代它们:

entities = [
        entity("Joe", person=True),
        entity("tulip", plant=True),
        entity("Mona Lisa"),
        entity("rose", plant=True),
        entity("Rose McGowan", person=True)
    ]

for e in entities:
    if e.plant:
        print(repr(e.name), "is a plant")

收率:

'tulip' is a plant
'rose' is a plant

请注意,在Python中,迭代集合的项目而不是索引(反对C,JavaScript和其他一些语言)很容易和惯用。

您还可以将集合过滤到新集合中,例如使用列表推导:

plants = [ e for e in entities if e.plant ]
print(plants)

收率:

[entity('tulip'), entity('rose')]

实体的漂亮表示,而不是<__main__.entity object at 0x104603668>之类的东西,就是我们定义__repr__方法的原因。