从父 class 创建子 class,参数相同
create child class from parent class, same arguments
我有一个父 class Parent
和一个子 class 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 = ... ?
给定一个父 class 实例,我怎样才能最好地从它创建子 class 实例?
我虽然可以添加类似
@classmethod
def from_parent(cls, parent):
return cls(
parent.alpha,
# parent.beta,
# parent.zeta,
# parent.omicron
)
但 Parent
没有从中创建另一个实例所需的所有参数。
有什么提示吗?
在这种情况下,似乎 Parent.__init__
做得太多了。额外的三个参数独立于 Parent
的实例;它们只是定义 c
属性的一种方式。
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)
没有通用的方法可以做你想做的事。任何实现都将特定于您的 classes。
但是,如果 Child
class 在其 __init__
中根本不执行任何操作(相当于没有 __init__
全部),你实际上可以改变你已经拥有的Parent
对象的class:
p.__class__ = Child
请注意,这是就地修改对象,而不是创建对象的新副本 Child
。
我有一个父 class Parent
和一个子 class 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 = ... ?
给定一个父 class 实例,我怎样才能最好地从它创建子 class 实例? 我虽然可以添加类似
@classmethod
def from_parent(cls, parent):
return cls(
parent.alpha,
# parent.beta,
# parent.zeta,
# parent.omicron
)
但 Parent
没有从中创建另一个实例所需的所有参数。
有什么提示吗?
在这种情况下,似乎 Parent.__init__
做得太多了。额外的三个参数独立于 Parent
的实例;它们只是定义 c
属性的一种方式。
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)
没有通用的方法可以做你想做的事。任何实现都将特定于您的 classes。
但是,如果 Child
class 在其 __init__
中根本不执行任何操作(相当于没有 __init__
全部),你实际上可以改变你已经拥有的Parent
对象的class:
p.__class__ = Child
请注意,这是就地修改对象,而不是创建对象的新副本 Child
。