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

