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

如何在子类ChildClass构造函数执行后自动调用父类func_z方法

子类构造完成后自动调用父类方法的实现方案

当前代码中,父类BaseClass的构造函数直接调用了func_z,导致该方法在子类ChildClass的构造逻辑执行前就被触发,无法得到期望的输出顺序。我们可以利用Python的__init_subclass__特性,在不手动修改子类构造函数、不重写func_z的前提下解决这个问题。

解决方案代码

class BaseClass:
    def __init__(self):
        print("BaseClass constructor")

    def func_z(self):
        print("BaseClass func_z")

    @classmethod
    def __init_subclass__(cls):
        # 保存子类原有的构造方法
        original_init = cls.__init__
        
        def wrapped_init(self, *args, **kwargs):
            # 执行子类原本的初始化流程
            original_init(self, *args, **kwargs)
            # 调用父类的func_z方法,确保使用父类实现
            BaseClass.func_z(self)
        
        # 替换子类的构造方法为包装后的版本
        cls.__init__ = wrapped_init

class ChildClass(BaseClass):
    def __init__(self):
        super().__init__()
        print("ChildClass constructor")

# 测试执行
ChildClass()

执行结果

BaseClass constructor
ChildClass constructor
BaseClass func_z

方案说明

  • __init_subclass__是Python 3.6及以上版本支持的特性,作为父类的类方法,会在每个子类定义时自动执行。我们通过它动态修改子类的__init__方法。
  • 包装后的wrapped_init方法会先完成子类全部的初始化逻辑(包括调用父类构造函数和子类自身的打印操作),之后再调用父类的func_z方法。
  • 直接使用BaseClass.func_z(self)调用方法,确保始终使用父类的func_z实现,完全满足“不能在子类中重写或覆盖func_z方法”的要求。

内容的提问来源于stack exchange,提问作者Farhang Amaji

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 12:14:55