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

在python中使用super继承form两个类。可以用super()调用父init方法吗?,python,multiple-inheritance,super,Python,Multiple Inheritance,Super,假设: 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 att

假设:

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()为参数'fathername'获取了多个值

以前的一些磋商:

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

  • 在另一个问题中,有很多正面的赞成票,也没有父母阶级的属性:

  • 这是一个更接近的解决方案,但没有用super()实现解决方案 实际上是建议远离继承范式

  • 这是一个很接近的例子:但是我看到父类中有super(),这是适得其反的,因为目标是不必修改父类

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

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

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

    class Person():
    定义初始化(self,name):
    self.\u name=name
    def get_名称(自身):
    返回self.\u name
    班级儿童(人):
    定义初始(自我、姓名、父亲姓名、母亲姓名):
    super()。\uuuu init\uuuu(名称)
    self.\u father=人(父亲姓名)
    self.\u mother=人(母亲姓名)
    def get_父亲_姓名(自我):
    返回自我。_父。获取_名()
    def获取母亲姓名(自我):
    返回自我。_母亲。获取_姓名()
    孩子=孩子(‘彼得’、‘约瑟夫’、‘玛丽’)
    打印(child.get\u name(),child.get\u父\u名(),child.get\u母\u名())
    
    印刷品:

    Peter Joseph Mary
    

    我支持重新考虑多重继承是否是最佳解决方案的建议。继承多个接口是可以的,但是通过继承来“购买”功能通常是一个糟糕的设计。请考虑回答。谢谢。这的确是一个很好的问题/答案。然而,出于某种原因,所有这些示例都不使用属性变量。i、 在我的例子中,实例化类child时需要做的第一件事是调用父类和母类的属性。它不仅仅是调用父类的方法。是关于在子类中使用父类的属性。您已经有了选项:您的父类正确地协作(您不能这样做,因为您不拥有它们);你把它们都显式地称为(不可伸缩);或者你做的不是继承。你可能不喜欢这些选择,但我们不能太在意这些。“喊叫”对任何人都没有帮助;我们需要更多的背景来解释为什么这些答案不能解决你的具体问题,因为你目前的解释没有意义。从最后一段开始,我甚至不知道你为什么认为继承是一种方式,似乎你应该在那些“父”类的列表上作曲。谢谢你的回答@Booboo。不幸的是,这不能飞。想象一种情况,在这种情况下,母亲和父亲是完全独立的,由两个不同的人编码。类子级应进一步将结果与其他NLP方法相结合,以进一步获得其他结果。我不可能修改这两个父类。考虑到你的前提,我会同意的。但我的前提是,无论是谁编写了原始的
    母亲
    父亲
    类,都犯了严重错误;这是我唯一的观点。我认为你不会在一个真正的IT部门找到你的实际情况。无论如何,我希望不会。这些类设计得很糟糕,不能用于多重继承,它们的抽象相当无用。但我要说的主要一点是,即使您坚持原始的类定义,也不应该使用多重继承。相反,您应该使用包含。@Booboo我认为您对类名的理解过于字面。我认为它们只是一个例子,所以这个建议并没有真正的帮助。如果你想从字面上理解,我可以批评你提出的设计,指出事实上并非每个孩子都有一个母亲和一个父亲;有单亲父母、同性父母和非双亲父母,有些孩子没有父母。但这显然没有抓住问题的关键,这是关于多重继承,而不是软件设计。谢谢@Booboo的见解。事实上,正如我现在编辑的问题,父亲和母亲的阶级是完全不同的,他们绝不可能是一个阶级的两个实例。Booboo:我们谈论的不是IT部门,而是找到一种方法来重用由其他pe完成的代码