如何重写基类A的__init__方法修改硬编码字符串?
解决方案与问题分析
一、核心需求实现:修改硬编码的'x'
你当前写的D类无法生效,因为A的__new__方法会返回B或C的实例,而非D的实例,导致D的__init__根本不会被执行。要实现修改硬编码的需求,需要重写D的__new__方法,绕开A的__new__逻辑,创建D自身的实例,再自定义初始化逻辑:
import os class D(A): def __new__(cls, root=None): # 直接调用object的__new__创建D类实例,跳过A__new__返回B/C的逻辑 instance = super(A, cls).__new__(cls) # 根据root条件,复刻B/C的初始化属性设置 if root == "Some conditions": instance.root = root instance._join = os.path.join else: instance.root = root return instance def __init__(self, root=None): # 这里替换硬编码的'x'为你需要的字符串,比如'y' local_variable = self._join(self.root, 'y') self.x = self.foo(local_variable) # 如果不需要修改A中foo的逻辑,可省略此方法 def foo(self, path): return super().foo(path)
创建D实例时,会直接生成D类型的对象,初始化时使用你指定的字符串替代原来的'x',从而得到预期的self.x。
二、A的__new__对重写的影响
是的,A的__new__方法会大幅增加重写的复杂度:
- 正常继承逻辑中,子类的
__new__会返回子类自身的实例,随后自动调用子类的__init__完成初始化。 - 但
A的__new__直接返回了B或C的实例,这相当于破坏了继承链——当你尝试创建D实例时,最终得到的是B/C的对象,D类的__init__和其他自定义逻辑完全不会被触发。 - 因此必须重写
D的__new__,手动创建D的实例,同时复刻B/C的属性初始化逻辑,才能让自定义的__init__生效。
内容的提问来源于stack exchange,提问作者Rick
相关产品推荐
相关产品推荐

