欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用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’>, <classobject>)

执行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
相关标签: python