Python继承层级中如何正确覆盖实例绑定的回调函数?
问题原因
你代码的执行顺序逻辑错误:子类__init__方法中,你先给self.test赋值自定义回调,再调用父类初始化方法,而父类__init__方法中会重新给self.test赋值为默认函数,直接覆盖了你在子类提前设置的自定义值。
解决方法
调整子类__init__方法的执行顺序,先调用父类初始化逻辑,再覆盖self.test的取值即可。
修正后代码
def callbacks(): print("callback") def create(): print ("override") def default(): print("default") class f1(object): def __init__(self): self.test=default def docallback(self): self.test() class f2(f1): def __init__(self): # 先执行父类初始化 super().__init__() # 再覆盖回调 self.test=create class f3(f2): def __init__(self): super().__init__() self.test=callbacks t1=f1() t2=f2() t3=f3() t1.docallback() t2.docallback() t3.docallback()
运行结果
default override callback
拓展建议
如果要做类FLTK的组件回调系统,更符合Python面向对象规范的写法是直接定义可重写的实例方法,而非用实例属性存储函数对象,示例如下:
class BaseComponent: def test(self): print("default") def docallback(self): self.test() class F2(BaseComponent): def test(self): print("override") class F3(BaseComponent): def test(self): print("callback")
这种写法无需手动在初始化方法中赋值,继承逻辑更清晰,也不会出现顺序错误导致的覆盖问题。
内容的提问来源于stack exchange,提问作者Mariwan
相关产品推荐
相关产品推荐

