You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 05:36:00