Python 如何将类的未定义属性分发到其他对象列表
我有一个类,它包含其他对象的列表(所有对象都是相同类型的)。每当我调用ObjectList类中未定义的属性时,我都希望该调用分布到所有“子”对象,如下所示: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
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')