使用super多继承及MRO顺序,解决菱形继承的父类二义性问题之进阶 参数问题
程序员文章站
2022-05-11 21:07:45
...
情形:首先感谢博主的讲解,详情看使用super多继承及MRO顺序,解决菱形继承的父类二义性问题
其次,在学习了博主文章后,想继续了解,参数的传递情况。于是对其进行了修改
class Human(object):
def __init__(self):
print("Human初始化开始")
super().__init__()
print("Human初始化完成")
self.height = 180
class Man(Human):
def __init__(self,y):
print("man初始化开始")
super(Man,self).__init__(y)# 注意此时 y 不可以少。
# 因为此时 从mro元祖中查看到 被调用的是 Wowan ,因此 super里的参数 会按顺序传递给 Woman 中,
# 因此会提示:TypeError: __init__() missing 1 required positional argument: 'x'
print("man初始化结束")
self.height_Man = y
def Man_height(self):
print(self.height_Man)
class Woman(Human):
def __init__(self,x):
print("woman初始化开始")
super(Woman,self).__init__()
print("woman初始化结束")
self.height_Woman = x
def Woman_height(self):
print(self.height_Woman)
class Son(Man, Woman):
def __init__(self,xx):
print("son初始化开始")
super(Son,self).__init__(xx)
print("son初始化结束")
son = Son(30)
print(Son.__mro__)
# print(Son.mro())
son.Man_height()
son.Woman_height()
如果不理解,可以参考博主 参数问题
原文如下:
class Fruit:
def __init__(self, form4, *args, **kwargs):
print("Fruit的init开始被调用")
self.form = form4
print("Fruit的init结束被调用")
class Apple(Fruit):
def __init__(self, form2, color2, *args, **kwargs):
print("Apple的init开始被调用")
self.color = color2
# 第二次执行super
super().__init__(form2, *args, **kwargs)
print("Apple的init结束被调用")
class Orange(Fruit):
def __init__(self, form3, season3, *args, **kwargs):
print("Orange的init开始被调用")
self.season = season3
# 第三次执行super
super().__init__(form3, *args, **kwargs)
print("Orange的init结束被调用")
class A_O(Apple, Orange):
def __init__(self, form1, color1, season1, *args, **kwargs):
print("A_O的init开始被调用")
# 第一执行super
super().__init__(form1, color1, season1, *args, **kwargs) # 这边的参数怎么传递呢?
print("A_O的init结束被调用")
ao = A_O("round", "red", "fall")
print("ao的形状是%s" % (ao.form))
print("ao的颜色是%s" % (ao.color))
print("ao的季节是%s" % (ao.season))
"""我们知道init的super调用,每执行到一次super时,都会从__mro__方法元组中顺序查找搜索,执行顺序为(<class ‘main.A_O’>, <class ‘main.Apple’>, <class ‘main.Orange’>, <class ‘main.Fruit’>, <class ‘object’>)
执行ao=A_O(“round”,“red”,“fall”)时,各参数进行赋值,“round”–>form1,“red”–>color1,“fall”–>season1
第一次执行super时
从mro元祖中查看到调用的是Apple,所以super里面的参数按顺序传递给Apple的init函数,form1–>form2,color1–>color2,season1–>*args,**kwargs–>**kwargs
第二次执行super时
从mro元祖中查看到调用的是Orange,所以super里面的参数按顺序传递给Orange的init函数,form2–>form3,*args–>season3,**kwargs–>**kwargs
第三次执行super时
从mro元祖中查看到调用的是Fruit,所以super里面的参数按顺序传递给Orange的init函数,form3–>form4,*args–>*args,**kwargs–>**kwargs