• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

经典类与新式类、钻石继承(菱形继承)、多继承之“广度优先”“深度优先”

python 搞java代码 3年前 (2022-05-21) 28次浏览 已收录 0个评论

一、经典类与新式类(了解)

  新式类:

    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>

www#gaodaima.com来源gao($daima.com搞@代@#码网搞代码

 

 

二、新式类查找属性和方法的顺序(了解)

  在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

 

  经典式深度优先不做展示。


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:经典类与新式类、钻石继承(菱形继承)、多继承之“广度优先”“深度优先”

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址