重新定义现有功能

时间:2014-01-23 12:23:19

标签: python class wxpython subclass

我定义了PyControl的子类,如下所示:

class MyBitmapButton(wx.PyControl):
    def __init__(self, parent, id=-1, bmp=None, label='blah', pos = wx.DefaultPosition, size=(166,220), style = 0, validator = wx.DefaultValidator,
                 name = "mybitmapbutton"):
        style |= wx.BORDER_NONE 
        wx.PyControl.__init__(self, parent, id, pos, size, style, validator, name)
        self.myimg = wx.StaticBitmap(self, -1, bmp, pos=(8,8), size=(150,150))
        self.mytxt = wx.StaticText(self, -1, label, (6,165))

    def Bind(self, *args, **kwargs):
        self.Bind(*args, **kwargs)         # infinite recursion problem ! 
        self.myimg.Bind(*args, **kwargs)
        self.mytxt.Bind(*args, **kwargs)

我想覆盖标准Bind,但在此定义中,我需要使用绑定(由{{1提供) }})。

使用此当前代码,我遇到wx.PyControl问题:

如何在 infinite recusion loop的定义中重复使用 Bind

2 个答案:

答案 0 :(得分:3)

您需要在此处使用super来访问超类的Bind版本:

super(MyBitmapButton, self).Bind(*args, **kwargs)

或者,在Python 3中,只需

super().Bind(*args, **kwargs).

答案 1 :(得分:1)

将此行self.Bind(*args, **kwargs)更改为:

super(MyBitmapButton, self).Bind(*args, **kwargs)
python3中的

将在没有参数的情况下工作:

super().Bind(*args, **kwargs)

来自super docs

  

返回将方法调用委托给父或者的代理对象   兄弟姐妹类型。这对于访问继承的方法很有用   在课堂上被覆盖的。搜索顺序与此相同   getattr()使用,除了跳过类型本身   ...