我为标题道歉......想不出别的什么。我有两个课程如下:
class Widget:
def __init__(self):
widgets.add(self)
def remove(self):
widgets_to_remove.add(self)
def update(self, events, mouse_pos):
pass
def draw(self, screen):
pass
class Widget_bundle(Widget):
def __init__(self, widget_group):
Widget.__init__(self)
self.widget_group = widget_group # list containing objects inheriting from Widget
self.call_for_all("remove")
def call_for_all(self, func, *args):
for w in self.widget_group:
getattr(w, func)(*args)
代码可以正常运行,但如果有办法在Widget
对象上调用由Widget_bundle
对象定义的方法并且widget_group
中的所有对象调用该方法,我希望如此}。显而易见的解决方案是为每个单一可能的方法创建一个方法,并使用for循环迭代对象,或者使用我的call_for_all method
,这需要将函数作为字符串并使代码的其他部分变得复杂化。包括。有第三种解决方案吗?
答案 0 :(得分:0)
听起来这是你的情况:
您的班级Widget_bundle
有一个属性Widget_bundle.widget_group
。该属性是类Widget
的列表。
您想拨打电话,例如Widget_bundle.remove()
,并将其转换为Widget.remove()
中每个Widget
的来电Widget_bundle.widget_group
。
解决此问题的一种方法是自定义Widget_bundle.__getattr__
方法。
class Widget_bundle(Widget):
def __init__(self, widget_group):
Widget.__init__(self)
self.widget_group = widget_group
def __getattr__(self, attr):
def _bundle_helper(*args, **kwargs):
for widget in self.widget_group:
getattr(widget, attr)(*args, **kwargs)
return _bundle_helper
或使用functools
:
import functools
class Widget_bundle(Widget):
def __init__(self, widget_group):
Widget.__init__(self)
self.widget_group = widget_group
def __getattr__(self, attr):
return functools.partial(self._bundle_helper, attr)
def _bundle_helper(self, attr, *args, **kwargs):
for widget in self.widget_group:
getattr(widget, attr)(*args, **kwargs)
现在您可以致电Widget_bundle.remove()
。