【发布时间】:2021-09-22 16:42:54
【问题描述】:
我有我想继承的类 A,这个类有一个类方法,可以从一些数据初始化一个新实例。我无权访问from_data 的代码,也无法更改 A 的实现。
我想使用传递给 A 的 from_data 方法的相同数据来初始化 B 类的新实例。在我想出的解决方案中,我在__new__(...) 中创建了一个新的A 实例,并将__class__ 更改为B。__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
【问题讨论】:
-
即使它确实可靠地工作,它也会让所有使用过你的代码的人感到困惑。你真的是说
B继承自A吗?考虑让B包含 一个A。然后你可以随心所欲地初始化它,没有人会质疑它。 -
a.__class__ = cls只是 hacky。为什么要这样做?为什么要先实现__new__?为什么不直接使用B.from_data((5, 3))....? -
您是否尝试过简单地调用
B.from_data(),然后摆脱您的__new__()?如果A.from_data()的实现与您展示的完全一样,那应该可以正常工作。 -
为什么需要重新实现它?你已经继承了它。
-
不,它没有。它返回一个
cls的实例,其中cls是您调用它的任何类。这就是 Python 中classmethod相对于staticmethod的优势。
标签: python python-3.x