是否可以在多重继承中从第二个 class 调用具有相同名称的函数

Is it possible to call function from second class with same name in multiple inheritance

假设我们有三个 classes

class Father:
    def __init__(self, father_name) -> None:
        self.father_name = father_name

    def name(self):
        print(f"Father name : {self.father_name}")

class Mother:
    def __init__(self, mother_name) -> None:
        self.mother_name = mother_name

    def name(self):
        print(f"Mother name : {self.mother_name}")

class Son(Father, Mother):
    def __init__(self, father_name, mother_name):
        Father.__init__(self, father_name)
        Mother.__init__(self, mother_name)

me = Son('Jamie', 'Jack', 'Linda')
me.name()

输出为:

父亲姓名:杰克

如何在不更改函数名称的情况下从母亲 class 而不是父亲 class 调用名称方法,以便输出为:

母亲姓名:琳达

你的代码中有一堆问题。

  • 您的示例无效。
  • 而不是:
    Father.__init__(self, father_name)
    Mother.__init__(self, mother_name)

你应该使用:

    super(Father, self).__init__(self, father_name)
    super(Mother, self).__init__(self, mother_name)

(假设你真的想在这里继承)

  • 父亲的name方法被调用是因为一个叫做MRO(方法解析顺序)的东西。值得一读,但不是您应该尝试修改的内容。如果你只想叫妈妈的名字而不是爸爸的名字,那么说 Son(Mother, Father) 而不是 Son(Father, Mother)

    很简单
  • 正如@Mark 所提到的,这不是一个合理的用例 遗产。 Childparents,不是parents.

总而言之,如果你想通过继承来实现,我的建议是:

class Son(Mother, Father):
    def __init__(self, father_name, mother_name):
        super(Father, self).__init__(self, father_name)
        super(Mother, self).__init__(self, mother_name)
    def name(self, ParentClass):
        return super(ParentClass, self).name()

me = Son('Jack', 'Linda')
me.name(Mother)
me.name(Father)

但是,我认为更合理的方法是使用属性。

class Son():
    def __init__(self, father_name, mother_name):
        self.father = Father(father_name)
        self.mother = Mother(mother_name)

me = Son('Jack', 'Linda')
me.mother.name()
me.father.name()

或者,更好的是,创建一个已经存在 Parent objects 的 Son。这样你就可以创建多个具有相同 parents.

的人
class Son():
    def __init__(self, father, mother):
        self.father = father
        self.mother = mother

mother = Mother('Linda')
father = Father('Jack')

me = Son(mother, father)
me.mother.name()
me.father.name()

你不应该做看起来像这样的事情,因为它甚至看起来很糟糕。

Python中有 MRO(方法解析顺序)的概念,如果你不想深入研究多重继承,你应该阅读它。

你的问题的答案就是交换父亲和母亲混音

class Son(Mother, Father):
    def __init__(self, my_name, father_name, mother_name):
        self.my_name = my_name            
        Father.__init__(self, father_name)
        Mother.__init__(self, mother_name)

不过要避免使用 Class.__init__ 的原始用法。 __init__ 不是对象创建,而是实例字段初始化,可能会导致意外结果。