一、经典类与新式类(了解)
新式类:
1)凡是继承object的类或子孙类都是新式类
2)在python3中所有的类都是新式类(默认继承object)
经典类:
1)必须在python2中才会有经典类与新式类之分
2)在python2中,凡是没有继承object的类,都是经典类
<span style="font-family:"><span>#</span><span> 新式类:</span> <span><a href="https://www.gaodaima.com/tag/class" title="查看更多关于class的文章" target="_blank">class</a></span><span> User(object): </span><span>pass</span> <span>class</span><span> Sub(User): </span><span>pass</span> <span>#</span><span> 在python3中所有的类都是新式类(默认继承object)</span> <span>class</span><span> Bar: </span><span>pass</span> <span>print</span>(Bar.<span>__bases__</span>) <span>#</span><span> (<class "object">,)</span></span>
二、新式类查找属性和方法的顺序(了解)
在python3中提供了一个新式类查找属性和方法的顺序的内置方法:
mro():会把当前类的继承关系列出来
调用mro返回的是一个继承序列:
super()的继承序列严格遵循mro继承序列
新式类查找属性和方法的顺序:
1)先从子类中查找
2)若子类中没有,从父类中查找,如果继承多个父类的情况下:从左到右
3)若父类中也没有,从object中查找
4)若object中也没有则报错
<span style="font-family:"><span>class</span><span> Father1: x </span>= 10 <span>class</span><span> Father2: x </span>= 20 <span>class</span><span> Father3: x </span>= 30 <span>#</span><span> 多继承的情况下:从左到右</span> <span>class</span><span> Sub(Father1, Father2, Father3): </span><span>#</span><span> 注意:__int__ 不是 __init__</span> <span>def</span> <span>__init__</span><span>(self): </span><span>print</span><span>(super().x) obj </span>=<span> Sub() </span><span>print</span><span>(Sub.mro()) </span><span>#</span><span> 子类和父类中都没有这个方法,但是object中有,所以从object中找到.__dir__</span> <span>print</span>(Sub.<span>__dir__</span>)</span>
执行结果:
<span style="font-family:">10<span> [</span><<span>class</span> <span>"</span><span>__main__.Sub</span><span>"</span>>, <<span>class</span> <span>"</span><span>__main__.Father1</span><span>"</span>>, <<span>class</span> <span>"</span><span>__main__.Father2</span><span>"</span>>, <<span>class</span> <span>"</span><span>__main__.Father3</span><span>"</span>>, <<span>class</span> <span>"</span><span>object</span><span>"</span>><span>] </span><method <span>"</span><span>__dir__</span><span>"</span> of <span>"</span><span>object</span><span>"</span> objects></span>
三、钻石继承(菱形继承)
继承多个父类的情况下会造成”钻石继承”
例:多继承
<span>class</span><span> A(object): </span><span>def</span><span> test(self): </span><span>print</span>(<span>"</span><span>from A</span><span>"</span><span>) </span><span>class</span><span> B(A): </span><span>def</span><span> test(self): </span><span>print</span>(<span>"</span><span>from B</span><span>"</span><span>) </span><span>class</span><span> C(A): </span><span>def</span><span> test(self): </span><span>print</span>(<span>"</span><span>from C</span><span>"</span><span>) </span><span>class</span><span> D(B): </span><span>def</span><span> test(self): </span><span>print</span>(<span>"</span><span>from D</span><span>"</span><span>) </span><span>class</span><span> E(C): </span><span>def</span><span> test(self): </span><span>print</span>(<span>"</span><span>from E</span><span>"</span><span>) </span><span>class</span><span> F(D, E): </span><span>def</span><span> test(self): </span><span>print</span>(<span>"</span><span>from F</span><span>"</span><span>) </span><span>print</span>(F.mro())
执行结果:
[<<span>class</span> <span>"</span><span>__main__.F</span><span>"</span>>, <<span>class</span> <span>"</span><span>__main__.D</span><span>"</span>>, <<span>class</span> <span>"</span><span>__main__.B</span><span>"</span>>, <<span>class</span> <span>"</span><span>__main__.E</span><span>"</span>>, <<span>class</span> <span>"</span><span>__main__.C</span><span>"</span>>, <<span>class</span> <span>"</span><span>__main__.A</span><span>"</span>>, <<span>class</span> <span>"</span><span>object</span><span>"</span>>]
继承结果图:
因为整体形状像钻石或者像菱形,所以叫做钻石继承,也叫做菱形继承。(类似的形状也可以,前提是多继承)
四、类继承之广度优先、深度优先
python 支持多继承,但对与经典类和新式类来说,多继承查找的顺序是不一样的。
内置方法mro()的查找顺序:
- 新式类
从左到右,广度优先
- 经典类
从左到右,深度优先
两种概念图:
新式类广度优先演示:
<span>class</span><span> A(object): </span><span>def</span><span> test(self): </span><span>print</span>(<span>"</span><span>from A</span><span>"</span><span>) </span><span>class</span><span> B(A): </span><span>#</span><span> def test(self):</span> <span>#</span><span> print("from B")</span> <span>pass</span> <span>class</span><span> C(A): </span><span>def</span><span> test(self): </span><span>print</span>(<span>"</span><span>from C</span><span>"</span><span>) </span><span>class</span><span> D(B): </span><span>#</span><span> def test(self):</span> <span>#</span><span> print("from D")</span> <span>pass</span> <span>class</span><span> E(C): </span><span>def</span><span> test(self): </span><span>print</span>(<span>"</span><span>from E</span><span>"</span><span>) </span><span>class</span><span> F(D, E): </span><span>#</span><span> def test(self):</span> <span>#</span><span> print("from F")</span> <span>pass</span><span> obj </span>=<span> F() </span><span>print</span>(obj.test())
执行结果:
<span>from</span> E
经典式深度优先不做展示。