如何在子类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
相关产品推荐
相关产品推荐

