我有一个类,其属性事先未知:
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(),或者甚至可以重新思考一切以实现我的目标?
答案 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
的当前实现,让Collection
看event.__dict__
而不是event.attributes
。但是,我不记得,除了您明确设置的属性之外,__dict__
可能还包含其他内容。我谨慎行事。
答案 1 :(得分:0)
您可以覆盖Collection类的__getattr__
方法,该方法在访问属性时调用。要访问未知的属性集,您可以使用event.__dict__
。所以,一个可能的解决方案是这样的:
def __getattr__(self, name):
return [m.__dict__.get(name) for m in self.members]