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

