python新式类和经典类的区别

1,新式类和经典类的区别:

广度优先和深度优先,这主要是在多类继承的时候会使用到,如下多类继承的D类对比:

经典类在加载的时候采用的是深度优先算法,二新式类采用的是广度优先算法:比如

经典类: 搜索顺序是(D,B,A,C)

>>> class A: attr = 1
...
>>> class B(A): pass
...
>>> class C(A): attr = 2
...
>>> class D(B,C): pass
...
>>> x = D()
>>> x.attr
1

新式类继承搜索程序是宽度优先

新式类:搜索顺序是(D,B,C,A)

>>> class A(object): attr = 1...>>> class B(A): pass...>>> class C(A): attr = 2...>>> class D(B,C): pass...>>> x = D()>>> x.attr2

总结:

1:经典类的深度优先,子类继承多个父类的时候,如果继承的多个类中有属性相同的,那么排在第一的父类的属性会覆盖后面继承的类的属性,也就是如果集成的多个父类属性相同,那么以继承的第一个父类的属性为主;

2:新式类的广度优先算法:子类继承多个父类的时候,如果继承的多个父类中有属性相同的,那么越往后继承的类将会覆盖前面的类的属性,也就是后来的继承的覆盖前面的;真正发挥了长江后浪推前浪的传统)

3. 新式类增加了__slots__内置属性, 可以把实例属性的种类锁定到__slots__规定的范围之中。

4. 新式类增加了__getattribute__方法

5.新式类内置有__new__方法而经典类没有__new__方法而只有__init__方法

注意:Python 2.x中默认都是经典类,只有显式继承了object才是新式类

     而Python 3.x中默认都是新式类(也即object类默认是所有类的祖先),不必显式的继承object(可以按照经典类的定义方式写一个经典类并分别在python2.x和3.x版本中使用dir函数检验下。

例如:class A():

      pass

    print(dir(A))

会发现在2.x下没有__new__方法而3.x下有。

接下来说下__new__方法和__init__的区别:

在python中创建类的一个实例时,如果该类具有__new__方法,会先调用__new__方法,__new__方法接受当前正在实例化的类作为第一个参数(这个参数的类型是type,这个类型在c和python的交互编程中具有重要的角色),其返回值是本次创建产生的实例,也就是我们熟知的__init__方法中的第一个参数self。那么就会有一个问题,这个实例怎么得到?

注意到有__new__方法的都是object类的后代,因此如果我们自己想要改写__new__方法(注意不改写时在创建实例的时候使用的是父类的__new__方法,如果父类没有则继续上溯)可以通过调用object的__new__方法类得到这个实例(这实际上也和python中的默认机制基本一致),如:

class display(object):def __init__(self, *args, **kwargs):print("init")def __new__(cls, *args, **kwargs):print("new")print(type(cls))return object.__new__(cls, *args, **kwargs)   a=display()

在实例创建过程中__new__方法先于__init__方法被调用,它的第一个参数类型为type。

如果不需要其它特殊的处理,可以使用object的__new__方法来得到创建的实例(也即self)。

于是我们可以发现,实际上可以使用其它类的__new__方法类得到这个实例,只要那个类或其父类或祖先有__new__方法。

class another(object):def __new__(cls,*args,**kwargs):print("newano")return object.__new__(cls, *args, **kwargs)   class display(object):def __init__(self, *args, **kwargs):print("init")def __new__(cls, *args, **kwargs):print("newdis")print(type(cls))return another.__new__(cls, *args, **kwargs)   a=display()# 上面的输出是:newdis
<class 'type'>
newano
init

所有我们发现__new__和__init__就像这么一个关系,__init__提供生产的原料self(但并不保证这个原料来源正宗,像上面那样它用的是另一个不相关的类的__new__方法类得到这个实例),而__init__就用__new__给的原料来完善这个对象

python新式类和经典类的区别相关推荐

  1. python新式类和经典类区别_Python中新式类和经典类的区别,钻石继承

    1)首先,写法不一样: class A: pass class B(object): 2)在多继承中,新式类采用广度优先搜索,而旧式类是采用深度优先搜索. 3)新式类更符合OOP编程思想,统一了pyt ...

  2. python中新式类和经典类的区别

    1.新式类和经典类 在Python 2及以前的版本中,由任意内置类型派生出的类(只要一个内置类型位于类树的某个位置),都属于"新式类",都会获得所有"新式类"的 ...

  3. python新式类好还是经典类_python新式类和经典类的区别?

    python新式类和经典类的区别? 1)首先,写法不一样: class A: pass class B(object): pass 2)在多继承中,新式类采用广度优先搜索,而旧式类是采用深度优先搜索. ...

  4. python新式类和经典类的区别?

    在python里凡是继承了object的类,都是新式类. Python2里面继承object的是新式类,没有写父类的是经典类. Python3里只有新式类. 经典类目前在Python里基本没有应用,多 ...

  5. Python 中的新式类和经典类的区别?

    1. 版本支持 / 写法差异# 在Python 2.x 中 如果你至今使用的还是 Python 2.x,那么你需要了解一下,在Python 2.x中存在着两种类:经典类和新式类. 什么是经典类? Co ...

  6. python单例模式控制成只初始化一次,常规型的python单例模式在新式类和经典类中的区别。...

    单例模式的写法非常多,但常规型的单例模式就是这样写的,各种代码可能略有差异,但核心就是要搞清楚类属性 实例属性,就很容易写出来,原理完全一模一样. 如下: 源码: class A(object):de ...

  7. python中的__new__与__init__,新式类和经典类(2.x)

    在python2.x中,从object继承得来的类称为新式类(如class A(object))不从object继承得来的类称为经典类(如class A()) 新式类跟经典类的差别主要是以下几点: 1 ...

  8. python中新式类和经典类

    python中的类分为新式类和经典类,具体有什么区别呢?简单的说, 1.新式类都从object继承,经典类不需要. Python 2.x中默认都是经典类,只有显式继承了object才是新式类 Pyth ...

  9. python3新式类_Python中新式类与经典类的区别详析

    1.新式类与经典类 在Python 2及以前的版本中,由任意内置类型派生出的类(只要一个内置类型位于类树的某个位置),都属于"新式类",都会获得所有"新式类"的 ...

最新文章

  1. CentOS7 php7.0 升级到php7.3
  2. ubuntu的学习教程(常用操作)
  3. 如何自学python到做项目-如何使用python进行第一个机器学习项目(详细教程篇)...
  4. Carbon和Polacode教程
  5. 三网融合情况下,实时语音通信技术的研究
  6. python操作sql_Python Mysql数据库操作,sql文件操作
  7. 她不讲武德,北航博士竟然把60年来的文本分类综述都整理了!!!
  8. 如何获取屏幕分辨率呢
  9. C语言实现任意进制的转换,主要注意代码的小技巧
  10. DevOps使用教程 华为云(14)持续集成 流水线 自动化测试 怎么用
  11. WebView 简单使用方法
  12. jsp实验报告(一)
  13. 如何使用PowerShell批量删除注册表项
  14. ESP32 micropython 应用填坑(一):蓝牙
  15. python中cls和self的区别
  16. TXSQL:云计算时代数据库核弹头——云+未来峰会开发者专场回顾 1
  17. Partial RenderPartial Action RenderAction 区别和用法
  18. [深度学习笔记(1)]深度学习入门
  19. [心得]google软件工程师技术准备
  20. 【English】十大词性之连词

热门文章

  1. 电影TS、TC、SCR、R5/、BD、HD等版本是什么意思?
  2. 最老程序员创业札记:全文检索、数据挖掘、推荐引擎应用42
  3. 线段树的建树 单点修改 区间查询
  4. 如何对一年级小学生进行养成教育
  5. 【Pytorch】torch.Tensor.expand_as()与torch.Tensor.expand()使用与比较
  6. Ubuntu16.04安装VSCode,并修改系统界面和编辑面板字体大小
  7. 群晖开启root权限及修复Moments的AI人像服务
  8. 鸿蒙之始 那个软件能播,智能电视安装这几款直播软件就够了,全是HD画质,还支持回看!...
  9. 具备统一门户功能的内网即时通讯软件才是发展趋势
  10. python是什么意思,Python怎么读