从列表中的对象中提取(事先未知)属性

时间:2015-08-09 18:20:12

标签: python list class

我有一个类,其属性事先未知:

class Event():
    def __init__(self, **kwargs):
        for key, value in kwargs.items():
            setattr(self, key, value)

和另一个基本上是对象列表的事件:

class Collection(list):
    def __init__(self):
        self.members = []

    def add(self,new):
        try:
            self.members.extend(new)
        except TypeError:
            self.members.append(new)

现在假设我定义了3个对象事件:

a = Event(name="a",value=1)
b = Event(name="b",value=2)
c = Event(name="c",other=True)

我从他们那里创建了一个集合:

col = Collection()
col.add([a,b,c])

我想要的是能够打印出给定属性的列表中对象的所有值(如果对象不存在该属性,则应返回None或任何其他预定义值)。例如:

print col.name #should return ["a","b","c"]
print col.value #should return [1,2,None]

我已阅读以下答案:Extract list of attributes from list of objects in python

但是这在这里不起作用,因为我的属性的名称不是提前知道的,有些甚至可能没有被定义。我应该如何定义我的类Collection(),或者甚至可以重新思考一切以实现我的目标?

2 个答案:

答案 0 :(得分:1)

这是"我想要创建动态变量名称"的变体。这里的解决方案是相同的:使用字典。

class Event(object):
    def __init__(self, **kwargs):
        self.attributes = dict(kwargs)

您的Collection课程需要自定义__getattr__方法,以便它可以在Event列表中查找值。

class Collection(object):
    # assume self.events is a list of Event objects
    def __getattr__(self, name):
        return [event.attributes.get(name) for event in self.events]

可以坚持使用Event的当前实现,让Collectionevent.__dict__而不是event.attributes。但是,我不记得,除了您明确设置的属性之外,__dict__可能还包含其他内容。我谨慎行事。

答案 1 :(得分:0)

您可以覆盖Collection类的__getattr__方法,该方法在访问属性时调用。要访问未知的属性集,您可以使用event.__dict__。所以,一个可能的解决方案是这样的:

def __getattr__(self, name):
    return [m.__dict__.get(name) for m in self.members]