我有一个父类Parent
和一个子类Child
,它们将所有初始化参数转发到Parent
。(它只添加了一些方法。(
class Parent:
def __init__(self, alpha, beta, zeta, omicron):
self.alpha = alpha
self.c = alpha + beta + zeta + omicron
class Child(Parent):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
def show(self):
print(self.alpha, self.c)
p = Parent(23.7, 0.0, 1.0, -4.1)
# create Child from p?
# c = ... ?
给定父类实例,如何最好地从中创建子类实例?我想我可以添加一些类似的东西
@classmethod
def from_parent(cls, parent):
return cls(
parent.alpha,
# parent.beta,
# parent.zeta,
# parent.omicron
)
但是Parent
不具备从中创建另一个实例所需的所有参数
有什么提示吗?
没有通用的方法来实现您想要的。任何实现都将特定于您的类。
但是,如果Child
类在其__init__
中根本不做任何事情(相当于根本没有__init__
(,则实际上可以更改已经拥有的Parent
对象的类:
p.__class__ = Child
请注意,这是在原地修改对象,而不是对Child
对象进行新的复制。
在这种情况下,Parent.__init__
似乎做得太多了。附加的三个自变量独立于Parent
的一个实例;它们只是定义CCD_ 12属性的一种方式。
class Parent:
def __init__(self, c):
self.alpha = alpha
self.c = c
@classmethod
def from_parameters(cls, alpha, beta, zeta, omicron):
return cls(alpha, alpha + beta + zeta + omicron)
class Child(Parent):
# Seemingly belongs in Parent, not here.
def show(self):
print(self.alpha, self.c)
@classmethod
def from_parent(cls, p):
return cls(p.alpha, p.c)
p = Parent.from_parameters(23.7, 0.0, 1.0, -4.1)
c = Child.from_parent(p)