在python中使用super继承form两个类。可以用super()调用父init方法吗?

2024-10-01 00:27:37 发布

您现在位置:Python中文网/ 问答频道 /正文

假设:

class Father():
    def __init__(self,fathername):
        self.papa = f"The father is {fathername.upper()}"

class Mother():
    # Mother class is COMPLETELY DIFFERENT AS Father.
    # The important thing is that they both built an attribute each.
    def __init__(self,mothername):
        self.mama = f"the mother is {mothername.lower()}"
        
class Child3(Father,Mother):
    def __init__(self,name,fathername,mothername):
        Father.__init__(self,fathername)
        Mother.__init__(self,mothername)
        self.name=name

以下两项工作:

c = Child3('Noa',fathername='J',mothername='M')
c = Child3('Noa','J','M')

到目前为止还不错。 但假设我想从几个类继承(不是多个嵌套继承,而是一个类从几个不从任何其他类继承的类继承) 如何使用super()初始化父类

以下操作不起作用:

class Child4(Father,Mother):
    def __init__(self,name,fathername,mothername):
        super().__init__(self,fathername=fathername,mothername=mothername)
        self.name=name

TypeError: init() got multiple values for argument 'fathername'

以前的一些磋商:

  1. How does Python's super() work with multiple inheritance? 这是一个非常完整的回答非常好,我已经投票了一些时间前了。尽管如此,这个问题还是有点不同,并非完全是我在这里提出的问题,即MRO(方法解决顺序)在这里并不重要。我想实现一种硬代码初始化父类以访问所有属性的方法。在上述问题中,投票最多的答案在父类中没有属性。在第二个投票最多的答案中,父类也没有属性。然而,在另一个答案中,有一个关于多重继承的MRO的非常完整的解释,这也不是重点,因为这里有一个单一的继承层次

  2. 在另一个问题中,有很多正面的赞成票,也没有父类的属性:Calling parent class __init__ with multiple inheritance, what's the right way?

  3. 这是一个更接近的解决方案,但没有使用super()Python - Calling __init__ for multiple parent classes实现解决方案 实际上是建议远离继承范式

  4. 这是一个很接近的例子:calling init for multiple parent classes with super?但是我看到父类中有super(),这是适得其反的,因为目标是不必修改父类

为了理解这个示例的使用以及为什么我必须使用继承,我认为第一个父类调用一个API并执行几个1000s代码的NLP过程来提取API响应的数据。第二个父类也是如此。然后,子类将尝试使用NLP进一步比较两者

给母亲和父亲上课。它们不是我编的。我没有机会修改它们。他们不依赖任何其他阶级


Tags: nameself属性initisdefmultipleclass
1条回答
网友
1楼 · 发布于 2024-10-01 00:27:37

孩子有一个母亲和一个父亲,最好将其设计为包含母亲和父亲属性。我认为以下类定义对您的案例更有意义:

class Person():
    def __init__(self, name):
        self._name = name

    def get_name(self):
        return self._name

class Child(Person):
    def __init__(self, name, father_name, mother_name):
        super().__init__(name)
        self._father = Person(father_name)
        self._mother = Person(mother_name)

    def get_father_name(self):
        return self._father.get_name()

    def get_mother_name(self):
        return self._mother.get_name()


child = Child('Peter', 'Joseph', 'Mary')
print(child.get_name(), child.get_father_name(), child.get_mother_name())

印刷品:

Peter Joseph Mary

相关问题 更多 >