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

Python中如何让子类调用new()返回自身实例而非父类实例

解决子类调用父类new()方法返回父类实例的问题

嘿,我来帮你搞定这个问题!你遇到的核心问题是:父类的new()方法里硬编码了return class1(),这就导致不管是父类实例还是子类实例调用这个方法,都会返回父类的对象。要让它动态返回当前调用者所属类的实例,咱们只需要做个小改动。

修复后的代码

class class1:
    def __init__(self):
        self.foo = 1
        self.bar = 2
    def new(self):
        # 用self.__class__获取当前实例的类,动态创建对应实例
        return self.__class__()

class class2(class1):
    def __init__(self):
        super().__init__()

c1 = class1()
c2 = class2()
print(c1.new())
print(c2.new())

运行结果

<__main__.class1 object at 0x0000027B681E57F0>
<__main__.class2 object at 0x0000027B681E5820>

为什么这样改?

  • self.__class__会自动指向当前实例所属的类:当c1(class1的实例)调用new()时,self.__class__就是class1;当c2(class2的实例)调用时,它就变成了class2。
  • 这样就实现了动态创建调用者所属类的实例,完全符合你想要的效果。

额外优化:改成类方法(更Pythonic)

如果你希望new()也能直接通过类调用(比如class2.new()),可以把它改成类方法,这样用法更灵活:

class class1:
    def __init__(self):
        self.foo = 1
        self.bar = 2
    @classmethod
    def new(cls):
        return cls()

class class2(class1):
    def __init__(self):
        super().__init__()

# 既可以通过类调用,也可以通过实例调用
c1 = class1.new()
c2 = class2.new()
print(c1)
print(c2)

这种写法更符合Python的惯用风格,不管是类还是实例调用,都能正确返回对应类的实例。

内容的提问来源于stack exchange,提问作者ellie ff1493

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:20:16