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

如何重写基类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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 05:54:57