gpt4 book ai didi

python - 如何使用类方法而不是调用构造函数来初始化父类?

转载 作者:行者123 更新时间:2023-12-04 11:43:24 25 4
gpt4 key购买 nike

我有一个我想继承的类 A,这个类有一个类方法,可以从一些数据初始化一个新实例。我无权访问 from_data 的代码并且不能改变 A 的实现。
我想使用传递给 A 的相同数据来初始化 B 类的新实例 from_data方法。在我提出的解决方案中,我在 __new__(...) 中创建了一个新的 A 实例。并更改 __class__ __init__(...)然后可以像往常一样进一步初始化“B的新实例”。它似乎有效,但我不确定这会产生某种副作用。
那么这会可靠地工作吗?有没有正确的方法来实现这一目标?

class A:
def __init__(self, alpha, beta):
self.alpha = alpha
self.beta = beta

@classmethod
def from_data(cls, data):
obj = cls(*data)
return obj


class B(A):
def __new__(cls, data):
a = A.from_data(data)
a.__class__ = cls
return a

def __init__(self, data):
pass


b = B((5, 3))
print(b.alpha, b.beta)
print(type(b))
print(isinstance(b, B))
输出:
5 3
<class '__main__.B'>
True

最佳答案

可能是你的用例比我理解的更抽象,但在 REPL 中测试,似乎调用父 class A构造函数通过 super()

class A:
# ...


class B(A):
def __init__(self, data):
super().__init__(*data)


b = B((5, 3))
print(b.alpha, b.beta)
print(type(b))
print(isinstance(b, B))
也会导致
5 3
<class '__main__.B'>
True
有什么理由不想打电话 super()实例化您的子类的新实例?

编辑:
因此,如果您需要使用 from_data构造函数...你可以做类似的事情
#... class A

class B(A):
def __init__(self, data):
a_obj = A.from_data(data)
for attr in a_obj.__dict__:
setattr(self, attr, getattr(a_obj, attr))
但这真的很hacky...并且不能保证对 A的所有属性都有效。类对象,特别是如果 __dict__功能已重载。

关于python - 如何使用类方法而不是调用构造函数来初始化父类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69288172/

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