zoukankan      html  css  js  c++  java
  • Python----面向对象--继承的实现原理

    一、面向对象中的类有两种,新式类和经典类

    1、在python2中,经典类是没有继承object的类,以及它的之类都称之为经典类

    示例代码如下

    class Foo:

      pass

    class Bar(Foo):

      pass

    2、在python2中,新式类是继承object的类,以及它的子类都称之为新式类

    示例代码如下:

    class Foo(object):

      pass

    class Bar(Foo):

      pass

    3、在python3中,只有一种面向对象编程的类,那就是新式类,一个类没有继承object类,默认就继承object

    示例代码如下:

    1 class Foo:
    2     pass
    3 
    4 
    5 print(Foo.__bases__)
    6 
    7 结果如下:
    8 
    9 (<class 'object'>,)

    二、多父类继承中属性查找顺序

    经典类继承顺序是按照深度优先

    新式类继承顺序是按照广度优先,下面已python3中的一段代码验证新式类的广度优先,示例代码如下:

     1 class A(object):
     2     def test(self):
     3         print('from A')
     4 
     5 
     6 class B(A):
     7     def test(self):
     8         print('from B')
     9 
    10 
    11 class C(A):
    12     def test(self):
    13         print('from C')
    14 
    15 
    16 class D(B):
    17     def test(self):
    18         print('from D')
    19 
    20 
    21 class E(C):
    22     def test(self):
    23         print('from E')
    24 
    25 
    26 class F(D, E):
    27     def test(self):
    28         print('from F')
    29     pass
    30 
    31 
    32 f1 = F()
    33 f1.test()

    执行所得结果为:from F

    把F类下的test函数注释,执行结果为:from D

    把D类下的test函数注释,执行结果为:from B

    把B类下的test函数注释,执行结果为:from E

    把E类下的test函数注释,执行结果为:from C

    把C类下的test函数注释,执行结果为:from A

    所以查找顺序为F---D----B-----E-----C------A

    与Print(F.mro())的结果[<class '__main__.F'>, <class '__main__.D'>, <class '__main__.B'>, <class '__main__.E'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>] 一致

    只有新式类才有mro方法

  • 相关阅读:
    Excel的小游戏总结
    借助“URLScan”工具隐藏header头服务器信息
    WinCe设备连接Win10系统
    WinForm 通过HttpWebRequest实现大文件上传
    Sql 动态行转列 pivot
    C# 调用LAKALA接口获取静态二维码数据
    蜗牛星际黑群晖硬盘休眠的设置
    GIT Windows服务端搭建笔记
    C#通过socket判断FTP服务器是否通畅并判断用户名密码是否正确
    C#获取MAC地址
  • 原文地址:https://www.cnblogs.com/xudachen/p/8597501.html
Copyright © 2011-2022 走看看