1

我想知道从同一类型的对象列表中获取属性的最佳方法是哪种。有没有比 for 循环更有效的解决方案?我尝试使用 getattr 但不使用列表。

只是为了说清楚。假设我已经定义了一个具有属性的类 FooBar

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

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

我可以做些什么来Bar同时获取整个列表的属性,以便最终结果是一个具有值 [5,6] 的列表吗?谢谢你的帮助

4

2 回答 2

10

您可以使用列表组合:

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

或者:

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

注意:它不是严格意义上的“同时”,而是一个接一个地循环对象是最好的。另请注意,对象甚至不需要属于同一类型 - 它们只需要具有属性即可Bargetattr 如果属性不存在,您可以使用它返回默认值:

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

或者,如果您想丢弃没有该属性而不是默认值的项目:

C = [obj.Bar for obj in (A, B) if hasattr(obj, 'Bar')]
于 2013-06-28T14:21:42.787 回答
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]
于 2013-06-28T14:36:19.417 回答