从父 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