Я хотел бы предположить, однако, что это не очень хороший подход, но он действительно подходит для отладки кода.

учаю список с объектами, которые имеют несколько атрибутов, например:

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.

 Mark Byers08 янв. 2011 г., 01:46
Это выглядит сомнительным дизайном для меня. Может быть, лучше изменить дизайн вашей программы, чтобы вам не нужно было это делать.

Ответы на вопрос(4)

Model.properties() (или жеinstance.properties() - это метод класса). Это возвращает имена свойств отображения словаря в экземпляры класса Property; Вы можете получить значение свойств, выполнив getattr (instance, name).

Если вы используетеExpando, есть такжеinstance.dynamic_properties(), который возвращает список динамически определенных свойств для этого объекта.

Решение Вопроса

когда это оправдано, но почти всегда лучше избегать такого рода хакерских решений. Если вы хотите, хотя, вы могли бы использовать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
 Nick Johnson12 янв. 2011 г., 05:58
@marcog Да, конечно. Модели App Engine создаются с использованием дескрипторов, поэтому все, что работает с дескрипторами, будет работать с ними. В любом случае, это, вероятно, лучше практиковать, поскольку текущий фрагмент кода обходит протокол дескриптора, что, вероятно, не является желаемым результатом.
 marcog12 янв. 2011 г., 01:20
@ Ник Спасибо, что указал на это. Я едва использовал AE. Я думаю, что это все еще стоит придерживаться общего случая Python (IIRC, вы не можете удалить принятый ответ в любом случае). Я добавил заметку сверху, хотя.
 marcog12 янв. 2011 г., 01:32
@Nick Likeэто? Вы говорите, что работает на AE?
 Nick Johnson12 янв. 2011 г., 01:26
@ Marcog Достаточно справедливо. Версия, которая работает в общем случае, заключалась бы в переборе ключей vars () и вызове getattr (a, k) для каждого. Конечно, он будет перебирать методы и другие нежелательные помехи в любом объекте.
 Nick Johnson12 янв. 2011 г., 01:13
Это не будет работать в App Engine, потому что члены сущности являются свойствами (дескрипторами), а не просто значениями.

С предположением, что объект вы вернетесь сq.fetch(5) иметь__dict__ атрибут, вы можете просто использоватьpprint для отображения вашей информации.

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

Или же, если есть что-то, что может быть преобразовано в словарь, аналогичная запись будет работать

>>> pprint.pprint(dict(results.dict_like_property))

Я хотел бы предположить, однако, что это не очень хороший подход, но он действительно подходит для отладки кода.

хитростьтрубчатый проход(само) функция, чтобы получить то, что вы хотите. например изменить способ итераций словаря:

>>> 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)
 Alex Leach10 янв. 2011 г., 10:29
Я дал более обширный пример создания объекта, повторяемого на этой странице:stackoverflow.com/questions/4642219/...

Ваш ответ на вопрос