我有一个包含其他对象(所有相同类型)列表的类。每当我调用ObjectList类中未定义的属性时,我都希望将调用分配给所有“子”对象,如下所示:
class ObjectList(object):
def __init__(self, child_objects):
self.child_objects = child_objects
ol = ObjectList([a, b, c])
ol.foo('bar')
# I now want that foo('bar') is called in every child object, like:
# a.foo('bar')
# b.foo('bar')
# c.foo('bar')
# I don't know the name of "foo" beforehand
我不知道这是否可行。这样做的背景是,有些代码以前只调用了一个对象,现在需要调用相同类型的对象列表。我不想更改围绕对象的所有代码以立即使用列表。
答案 0 :(得分:1)
class ObjectList:
def __init__(self, child_objects):
self.child_objects = child_objects
def __getattr__(self, name):
def looper(*args, **kwargs):
for obj in self.child_objects:
attr = getattr(obj, name)
attr(*args, **kwargs)
return looper
class Obj:
def __init__(self, data):
self.data = data
def __repr__(self):
return '{}({})'.format(type(self).__name__, self.data)
def foo(self, arg):
print('Object', self, 'called with', arg)
ol = ObjectList([Obj('a'), Obj('b'), Obj('c'),])
ol.foo('bar')
您可以使用__setattr__
类似地处理分配情况。
答案 1 :(得分:0)
__getattr__
是访问对象上不存在的属性时调用的方法。您可以定义它以在子代上调用相同的属性:
class ObjectList(object):
def __getattr__(self, name):
return [getattr(child, name) for child in self.child_objects]