2013-06-28 12 views
1

我想知道從同一類型的對象列表中獲取屬性的最佳方式。有沒有比for循環更有效的解決方案?我嘗試過getattr,但沒有使用列表。Python:以最有效的方式從相同類型的對象列表中獲取屬性

只是爲了說清楚。比方說,我已定義的類美孚與屬性Bar

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

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

我能做些什麼,同時獲得屬性Bar整個列表,以便最終的結果將與值[5列表, 6]? 感謝您的幫助

+0

你的例子是缺少冒號的前兩行。 –

回答

10

你可以使用一個列表-COMP:

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

爲什麼attrgetter而不是getattr? (在電話上) –

+1

@limelights更容易傳遞給'map'作爲一項功能... –

+0

學到了新東西,謝謝喬恩! –

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] 
相關問題