zoukankan      html  css  js  c++  java
  • python2中的新式类与经典类区别

    D继承于B类和C类,B类和C类分别继承于父类A,其中A类不继承于object。

    这段代码的输出时这样的:

     现在我们换种写法,让父类A继承于object,其他不做变动,如下图:

     猜一猜结果变成了什么:

    是不是很奇怪,这是为什么呢?

    我们把未继承object的类称为经典类,把继承object的类称为新式类

    为了便于理解我们画出上述例子的关系图,上述例子的继承关系图是这样的:、

    经典类(不继承object)使用的解释顺序是MRO算法,该算法基于深度优先,也就是说,上述例子中,解释顺序是这个样子的:

    由D出发 查找继承类B是否有func()方法,没有则继续查找B的继承类A是否有,查找到A有,则查找结束,否则继续查找C。

    即查找顺序如下图红线所示:

     

    新式类(继承object)使用的解释顺序是C3算法,查找顺序有所区别;

    由D出发,查找继承类B是否有func()方法,没有则继续查找继承类C的是否有func方法,查找到有则查找结束,否则继续查找A,直至查找至object

    即查找顺序入下图红线所示:

     可以通过__mro__属性知道新式类的查找顺序,经典类没有这个属性

    所以,经典类和新式类的区别之一,即继承object和不继承object的区别之一在于多继承时其继承顺序不同,经典类采用深度优先方法,新式类采用C3算法。

    二、新式类有super方法,经典类没有

    三、新式类提供了__new__方法,用于提供方法以实例化不可变对象,如派生的字符串,数字等

    四、新式类提供了更多的方法,如__get__,__set__方法,有这些方法的对象称为描述器。

    五、定义一个经典类,实际上并不会创建一个新的类型,类是类对象,实例是实例对象,而新式类做了统一,定义一个新的类就是创建了一个新的类型。可以用type()来验证

    # 新式类ListenerToPoFile继承了基类object
    # 经典类和新式类的区别之一,即继承object和不继承object的区别之一在于多继承时其继承顺序不同,经典类采用深度优先方法,新式类采用C3算法。
    # 多继承时,查找顺序广度优先 新式类有super方法
    # 新式类提供了__new__方法,用于提供方法以实例化不可变对象,如派生的字符串,数字等
    # 新式类提供了更多的方法,如__get__,__set__方法,有这些方法的对象称为描述器
    # 定义一个经典类,实际上并不会创建一个新的类型,类是类对象,实例是实例对象,而新式类做了统一,定义一个新的类就是创建了一个新的类型。可以用type()来验证
     
  • 相关阅读:
    ArcGIS几种数据格式
    C#中的接口
    OpenFileDialog获取文件名和文件路径问题
    OO与设计模式的原则、目标
    设计模式-工厂模式三部曲
    .NET设计模式: 工厂模式
    最详细eclipse汉化插件安装教程
    Eclipse IDE for C/C++ Developers安装配置详解
    使用 Eclipse C/C++ Development Toolkit 开发应用程序
    VS开发好用的扩展
  • 原文地址:https://www.cnblogs.com/yuelinyan/p/13036590.html
Copyright © 2011-2022 走看看