2013-06-28 2 views
1

Мне было интересно, какой из лучших способов получить атрибут из списка объектов того же типа. Существует ли более эффективное решение, чем цикл for? Я пытался с getattr, но не работал со списками.Python: Получить атрибут из списка объектов одного и того же типа наиболее эффективным способом

Просто, чтобы все было ясно. Скажем, я определил класс Foo с атрибутом Bar

class Foo(): 
    def __init__(self, Bar): 
     self.bar = Bar 

A = Foo(5) 
B = Foo(6) 
C = [A,B] 

Могу ли я сделать что-то, чтобы получить атрибут Bar в то же время за весь список, так что конечный результат будет список со значениями [5, 6]? Спасибо за вашу помощь

+0

Ваш пример отсутствует двоеточие на первых двух строках. –

ответ

10

Вы можете использовать список-Комп:

C = [obj.Bar for obj in (A, B)] 

Или в качестве альтернативы:

from operator import attrgetter 
C = map(attrgetter('Bar'), (A, B)) 

Примечание: Это не строго "в то же время", но зацикливание над объекты один за другим так же хороши, как и все. Также обратите внимание, что объекты не обязательно должны быть одного типа - им просто нужно иметь атрибут Bar. Вы можете использовать getattr для возврата значения по умолчанию, если атрибут не существует:

C = [getattr(obj, 'Bar', None) for obj in (A, B)] 

Или, если вы хотите, чтобы выбросить вещи, которые не имеют этого атрибута вместо значения по умолчанию:

C = [obj.Bar for obj in (A, B) if hasattr(obj, 'Bar')] 
+0

Зачем забираться, а не getattr? (по телефону) –

+1

@limelights проще перейти на 'map' как функцию ... –

+0

узнал что-то новое, спасибо Jon! –

0
C = [getattr(obj, 'Bar') for obj in [A, B]] 

Вы можете даже использовать:

>>> for nam in dir(): 
...  obj = eval(nam) 
...  if isinstance(obj, Foo): 
...  C.append(getattr(obj, 'Bar')) 
... 
>>> C 
[5, 6]