python 多继承相关整理

本文深入探讨了Python中三种不同的继承方法:直接调用父类方法、使用super()以及指定类名调用super(),并详细解析了它们在单继承和多继承场景下的差异。特别强调了super()方法在多继承中的MRO(方法解析顺序)作用,以及如何正确地传递参数。

python 继承相关总结

近期工作中经常使用多线程, 公司规定使用继承重写 run() 的方式启线程. 在继承并重写 threading.Thread __init__()时想到之前总结过 python 三种不同继承的方法之间的区别. 今天抽出时间再次整理,方便以后使用.

继承方法

  1. 父类名.方法( 参数 )
  2. super().方法( 参数 )
  3. super( 类名 ).方法( 参数 )

单继承

super().方法 相对于 类名.方法 在单继承上用法基本无差.

多继承

以上三种方法在单继承中基本没差,但在多继承上有较大区别, super 方法能保证每个父类的方法只会执行一次, 而使用 类名 的方法会导致方法被执行多次. 说道super方法能保证每个父类的方法只会执行一次就必须引出 多继承中的MRO

多继承中的MRO

多继承中的MRO 通过 类名.__mro__ 得到一个元组, super 方法并非简单的调用父类, 而是根据当前类__mro__元组的顺序调用父类方法.具体原理通过计算机的C3算法实现,也有一种交简单的画图发可以轻松得到多继承中MRO顺序,有兴趣的同学可以自行了解,这里不多赘述.

# –*– coding: utf-8 –*–
# @Time      : 2019/1/7 21:08
# @Author    : Damon_duanlei
# @FileName  : mult_inherit.py
# @BlogsAddr : https://blog.youkuaiyun.com/Damon_duanlei


class Human(object):
    pass


class Grandpa(Human):
    pass


class Grandma(Human):
    pass


class Father(Grandpa, Grandma):
    pass


class Mother(Human):
    pass


class You(Father, Mother):
    pass


if __name__ == '__main__':
    print(You.__mro__)

运行结果:

>>>
(<class '__main__.You'>, <class '__main__.Father'>, <class '__main__.Grandpa'>,
 <class '__main__.Grandma'>, <class '__main__.Mother'>,
 <class '__main__.Human'>, <class 'object'>)

在了解的 python 多继承 MRO 后, 再次总结三种多继承的区别:

  1. 父类名.方法( 参数)

    简单,但多继承中会被多次调用

    # –*– coding: utf-8 –*–
    # @Time      : 2019/1/7 21:08
    # @Author    : Damon_duanlei
    # @FileName  : mult_inherit.py
    # @BlogsAddr : https://blog.youkuaiyun.com/Damon_duanlei
    
    
    class Human(object):
        def __init__(self):
            print("I am Human")
    
    
    class Grandpa(Human):
        def __init__(self):
            print("I am Grandpa")
            Human.__init__(self)
    
    
    class Grandma(Human):
        def __init__(self):
            print("I am Grandma")
            Human.__init__(self)
    
    
    class Father(Grandpa, Grandma):
        def __init__(self):
            print("I am Father")
            Grandpa.__init__(self)
            Grandma.__init__(self)
    
    
    class Mother(Human):
        def __init__(self):
            print("I am Mother")
            Human.__init__(self)
    
    
    class You(Father, Mother):
        def __init__(self):
            print("myself")
            Father.__init__(self)
            Mother.__init__(self)
    
    
    if __name__ == '__main__':
        print(You.__mro__)
        you = You()
    
    
    

    运行结果:

    >>>
    (<class '__main__.You'>, <class '__main__.Father'>, <class '__main__.Grandpa'>, <class '__main__.Grandma'>, <class '__main__.Mother'>, <class '__main__.Human'>, <class 'object'>)
    myself
    I am Father
    I am Grandpa
    I am Human
    I am Grandma
    I am Human
    I am Mother
    I am Human
    
  2. super().方法( 参数 )

    不写类名,默认当前类去MRO中找下一个类调用方法

    # –*– coding: utf-8 –*–
    # @Time      : 2019/1/7 21:08
    # @Author    : Damon_duanlei
    # @FileName  : mult_inherit.py
    # @BlogsAddr : https://blog.youkuaiyun.com/Damon_duanlei
    
    
    class Human(object):
        def __init__(self):
            print("I am Human")
    
    
    class Grandpa(Human):
        def __init__(self):
            print("I am Grandpa")
            super().__init__()
    
    
    class Grandma(Human):
        def __init__(self):
            print("I am Grandma")
            super().__init__()
    
    
    class Father(Grandpa, Grandma):
        def __init__(self):
            print("I am Father")
            super().__init__()
    
    
    class Mother(Human):
        def __init__(self):
            print("I am Mother")
            super().__init__()
    
    
    class You(Father, Mother):
        def __init__(self):
            print("myself")
            super().__init__()
    
    
    if __name__ == '__main__':
        you = You()
    
    
    

    运行结果:

    >>>
    (<class '__main__.You'>, <class '__main__.Father'>, <class '__main__.Grandpa'>, 
    <class '__main__.Grandma'>, <class '__main__.Mother'>, <class '__main__.Human'>,
    <class 'object'>)
    myself
    I am Father
    I am Grandpa
    I am Grandma
    I am Mother
    I am Human
    
  3. super( 类名, self ).方法( 参数 )

    写类名, 按类名去MRO 中找下一个类(此方法可直接跳过一段程序)

    # –*– coding: utf-8 –*–
    # @Time      : 2019/1/7 21:08
    # @Author    : Damon_duanlei
    # @FileName  : mult_inherit.py
    # @BlogsAddr : https://blog.youkuaiyun.com/Damon_duanlei
    
    
    class Human(object):
        def __init__(self):
            print("I am Human")
    
    
    class Grandpa(Human):
        def __init__(self):
            print("I am Grandpa")
            super().__init__()
    
    
    class Grandma(Human):
        def __init__(self):
            print("I am Grandma")
            super().__init__()
    
    
    class Father(Grandpa, Grandma):
        def __init__(self):
            print("I am Father")
            super().__init__()
    
    
    class Mother(Human):
        def __init__(self):
            print("I am Mother")
            super().__init__()
    
    
    class You(Father, Mother):
        def __init__(self):
            print("myself")
            super(Grandpa, self).__init__()
    
    
    if __name__ == '__main__':
        print(You.__mro__)
        you = You()
    
    
    >>>
    (<class '__main__.You'>, <class '__main__.Father'>, <class '__main__.Grandpa'>,
     <class '__main__.Grandma'>, <class '__main__.Mother'>,
     <class '__main__.Human'>, <class 'object'>)
    myself
    I am Grandma
    I am Mother
    I am Human
    

注意:

多继承时, 使用super方法对父类传参时, 必须把所有参数传递( 包括重写方法时新增的参数 ) 否则报错. 单继承使用 super 方法则不能全部传递, 只能传递父类所需的参数.

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值