如何将类的未定义属性分配给其他对象列表

时间:2018-08-10 08:22:52

标签: 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') 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

我不知道这是否可行。这样做的背景是,有些代码以前只调用了一个对象,现在需要调用相同类型的对象列表。我不想更改围绕对象的所有代码以立即使用列表。

2 个答案:

答案 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]
相关问题