【问题标题】:create child class from parent class, same arguments从父类创建子类,相同的参数
【发布时间】:2022-01-16 09:39:43
【问题描述】:

我有一个父类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 没有从它创建另一个实例所需的所有参数。

有什么提示吗?

【问题讨论】:

    标签: python class instantiation


    【解决方案1】:

    在这种情况下,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)
    

    【讨论】:

      【解决方案2】:

      没有通用的方法来做你想做的事。任何实现都将特定于您的类。

      但是,如果Child 类在其__init__ 中根本不做任何事情(相当于根本没有__init__),您实际上可以更改@ 的类987654324@ 您已经拥有的对象:

      p.__class__ = Child
      

      请注意,这是在原地修改对象,而不是创建 Child 对象的新副本。

      【讨论】:

        猜你喜欢
        • 2020-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多