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

如何让Python父类方法返回调用它的子类实例?

如何让Python父类方法返回调用它的子类实例?

你提到的用type(self)(args)的方法完全正确,而且这正是Python里处理这类场景的惯用最优解!

先给你修改后的可运行代码示例,一看就明白:

class A:
    def __init__(self, args):
        self.args = args  # 这里写你的初始化逻辑

    def f(self) -> 'A':
        # 这里写你需要的处理逻辑,基于self生成新的参数
        new_args = f"{self.args}_processed"
        # 关键:用type(self)代替硬编码的A
        return type(self)(new_args)

class B(A):
    pass

class C(A):
    pass

测试一下:

x = B("b_instance")
y = x.f()
assert isinstance(y, B)  # 现在这个断言会通过,不会报错

z = C("c_instance")
w = z.f()
assert isinstance(w, C)

为什么这个方法好用?

  • type(self)会动态获取当前调用方法的实例所属的类:当子类B的实例调用f时,type(self)就是B;子类C的实例调用时,就是C。这样构造出来的新实例自然就是对应子类的类型,完美符合你要的“f(B)返回B,f(C)返回C”的要求。
  • 完全遵循DRY原则(Don't Repeat Yourself):不用在B和C里重复写几乎一样的f方法,父类的f一次写完,所有子类都能复用,后续要修改f的逻辑也只需要改父类,维护成本低。

如果之后你的子类构造函数和父类有差异,可能需要额外处理,但在你当前的场景(子类继承父类的构造逻辑)下,这个方案绝对是最简洁优雅的。

备注:内容来源于stack exchange,提问作者Plop

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 15:24:29