是否可以在多重继承中从第二个 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 所提到的,这不是一个合理的用例
遗产。 Child有parents,不是是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__
不是对象创建,而是实例字段初始化,可能会导致意外结果。
假设我们有三个 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 所提到的,这不是一个合理的用例 遗产。 Child有parents,不是是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__
不是对象创建,而是实例字段初始化,可能会导致意外结果。