• 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方法

  • 相关阅读:
    springmvc与servlet初识理解2
    springMVC与servlet的初识
    SpringMVC的依赖和视图解析器配置
    【内网渗透】— 内网信息收集(4)
    机械行业设计软件学习资源整理
    整理的电学课程
    redis src 目录组织结构
    解决Joi报错TypeError: Joi.Validate is not a function问题
    浅谈Node.js开发Web服务器
    JavaScript水仙花数(传递任意n位数)
  • 原文地址:https://www.cnblogs.com/xudachen/p/8597501.html
Copyright © 2020-2023  润新知