所以我在从这个类实例化的对象数组中有一个对象:
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显然是错误的,我不知道如何引用对象名称的价值?
答案 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
请注意,原始代码中person
和plant
是__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}}方法集
person
和plant
到False
。因此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__
方法的原因。