Python 如何将类的未定义属性分发到其他对象列表

Python 如何将类的未定义属性分发到其他对象列表,python,Python,我有一个类,它包含其他对象的列表(所有对象都是相同类型的)。每当我调用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

我有一个类,它包含其他对象的列表(所有对象都是相同类型的)。每当我调用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

我不知道这是否可能。其背景是,有一些代码以前只调用一个对象,现在需要调用相同类型的对象列表。我现在不想更改对象周围的所有代码来处理列表。

\uuu getattr\uuu
是访问对象上不存在的属性时调用的方法。您可以定义它来调用子级上的相同属性:

class ObjectList(object):
    def __getattr__(self, name):
        return [getattr(child, name) for child in self.child_objects]

您可以使用
\uuuu setattr\uuuuuu

类似地处理赋值情况。很抱歉,我忘记了一个特殊情况,这也需要用于属性赋值,如ol.x=y。这似乎不适用于getattr。
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')