gpt4 book ai didi

python - 使用现有实例初始化 super?

转载 作者:行者123 更新时间:2023-12-02 13:58:39 25 4
gpt4 key购买 nike

假设我有:

class Super:
def __init__(self,a):
self.a = a
@classmethod
def from_b(cls,b):
return cls(b.to_a())

class Regular(Super):
def __init__(self,b):
# how to set my super to the output of
super = super.from_b(b)

如何使用父类(super class)方法的输出而不是 init 正确初始化父类(super class)?

我的 OOP 背景是 C++,由于能够在 C++ 中重载构造函数,所以我不断地进入这些场景,因此解决这个问题的方法会很棒。

最佳答案

@shx2 的答案有效,但浪费/笨拙地创建了一个一次性的 Super 对象,只是为了使用其 a 属性初始化新的 Regular 对象.

如果您可以控制 Super 的源代码,则可以使 from_b 方法创建给定子类的实例,并让子类调用 from_b 方法改为在其 __new__ 方法中,这样就可以直接创建和初始化 Regular 对象:

class Super:
def __init__(self, a):
self.a = a

@classmethod
def from_b(cls, b):
obj = super().__new__(cls)
cls.__init__(obj, b.to_a())
return obj

class Regular(Super):
def __new__(cls, b):
return super().from_b(b)

这样以下断言就会通过:

from unittest.mock import Mock

obj = Regular(Mock())
assert type(obj) is Regular
assert obj.a.to_a.is_called()

关于python - 使用现有实例初始化 super?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59670708/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com