使对象的属性可迭代

时间:2011-01-08 00:39:29

标签: python google-app-engine iteration

我收到一个包含多个属性的列表,如下所示:

results = q.fetch(5)
for p in results:
    print "%s %s, %d inches tall" % (p.first_name, p.last_name, p.height

是否可以迭代这些属性,以便我可以执行for x in p之类的操作。我想检查每一个的值,但我不想创建一个巨大的IF语句块。

4 个答案:

答案 0 :(得分:6)

我警告不要这样做。很少有例外情况需要保证,但几乎所有时候最好避免使用这种黑客解决方案。但是,如果您愿意,可以使用vars()获取属性字典并迭代它。正如@Nick在下面指出的那样,App Engine使用属性而不是值来定义其成员,因此您必须使用getattr()来获取它们的值。

results = q.fetch(5)
for p in results:
    for attribute in vars(p).keys()
        print '%s = %s' % (attribute, str(getattr(p, attribute)))

演示vars()的作用:

>>> class A:
...     def __init__(self, a, b):
...         self.a = a
...         self.b = b
... 
>>> a = A(1, 2)
>>> vars(a)
{'a': 1, 'b': 2}
>>> for attribute in vars(a).keys():
...     print '%s = %s' % (attribute, str(getattr(a, attribute)))
... 
a = 1
b = 2

答案 1 :(得分:3)

您可以对原始变量类型进行子类化,并定义自己的狡猾 iter (自我)函数,以获得所需内容。 例如改变字典迭代的方式: -

>>> class mydict(dict):
...    def __iter__(self):
...      for i in self.items():
...          yield i
... 
>>> x = mydict( {'a' : 1, 'b':2 } )
>>> for i in x:
...   print i
... 
('a', 1)
('b', 2)

答案 2 :(得分:1)

要获取模型类的属性列表,请调用Model.properties()(或instance.properties() - 这是一种类方法)。这会返回一个字典映射属性名称到Property类实例;您可以通过执行getattr(实例,名称)来获取属性的值。

如果您使用的是Expando,那么还会instance.dynamic_properties(),它会返回该对象上动态定义属性的列表。

答案 3 :(得分:0)

假设您从[{1}}获取的对象具有q.fetch(5)属性,您只需使用__dict__即可显示您的信息。

pprint

或者,如果它具有可以转换为字典的内容,则类似的符号可以起作用

>>> import pprint
>>> results = q.fetch(5)
>>> pprint.pprint(results.__dict__())

我建议,这不是一个好的方法,但它确实适用于调试代码。