Python:编辑子对象中包含的对象的子方法

时间:2016-10-18 22:36:28

标签: python inheritance methods

我为标题道歉......想不出别的什么。我有两个课程如下:

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,这需要将函数作为字符串并使代码的其他部分变得复杂化。包括。有第三种解决方案吗?

1 个答案:

答案 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()

我提到this StackOverflow question