python 继承相关总结
近期工作中经常使用多线程, 公司规定使用继承重写 run() 的方式启线程. 在继承并重写 threading.Thread __init__()时想到之前总结过 python 三种不同继承的方法之间的区别. 今天抽出时间再次整理,方便以后使用.
继承方法
- 父类名.方法( 参数 )
- super().方法( 参数 )
- 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 后, 再次总结三种多继承的区别:
-
父类名.方法( 参数)
简单,但多继承中会被多次调用
# –*– 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 -
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 -
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 方法则不能全部传递, 只能传递父类所需的参数.

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

被折叠的 条评论
为什么被折叠?



