python新式类和经典类的区别
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新式类和经典类的区别相关推荐
- python新式类和经典类区别_Python中新式类和经典类的区别,钻石继承
1)首先,写法不一样: class A: pass class B(object): 2)在多继承中,新式类采用广度优先搜索,而旧式类是采用深度优先搜索. 3)新式类更符合OOP编程思想,统一了pyt ...
- python中新式类和经典类的区别
1.新式类和经典类 在Python 2及以前的版本中,由任意内置类型派生出的类(只要一个内置类型位于类树的某个位置),都属于"新式类",都会获得所有"新式类"的 ...
- python新式类好还是经典类_python新式类和经典类的区别?
python新式类和经典类的区别? 1)首先,写法不一样: class A: pass class B(object): pass 2)在多继承中,新式类采用广度优先搜索,而旧式类是采用深度优先搜索. ...
- python新式类和经典类的区别?
在python里凡是继承了object的类,都是新式类. Python2里面继承object的是新式类,没有写父类的是经典类. Python3里只有新式类. 经典类目前在Python里基本没有应用,多 ...
- Python 中的新式类和经典类的区别?
1. 版本支持 / 写法差异# 在Python 2.x 中 如果你至今使用的还是 Python 2.x,那么你需要了解一下,在Python 2.x中存在着两种类:经典类和新式类. 什么是经典类? Co ...
- python单例模式控制成只初始化一次,常规型的python单例模式在新式类和经典类中的区别。...
单例模式的写法非常多,但常规型的单例模式就是这样写的,各种代码可能略有差异,但核心就是要搞清楚类属性 实例属性,就很容易写出来,原理完全一模一样. 如下: 源码: class A(object):de ...
- python中的__new__与__init__,新式类和经典类(2.x)
在python2.x中,从object继承得来的类称为新式类(如class A(object))不从object继承得来的类称为经典类(如class A()) 新式类跟经典类的差别主要是以下几点: 1 ...
- python中新式类和经典类
python中的类分为新式类和经典类,具体有什么区别呢?简单的说, 1.新式类都从object继承,经典类不需要. Python 2.x中默认都是经典类,只有显式继承了object才是新式类 Pyth ...
- python3新式类_Python中新式类与经典类的区别详析
1.新式类与经典类 在Python 2及以前的版本中,由任意内置类型派生出的类(只要一个内置类型位于类树的某个位置),都属于"新式类",都会获得所有"新式类"的 ...
最新文章
- CentOS7 php7.0 升级到php7.3
- ubuntu的学习教程(常用操作)
- 如何自学python到做项目-如何使用python进行第一个机器学习项目(详细教程篇)...
- Carbon和Polacode教程
- 三网融合情况下,实时语音通信技术的研究
- python操作sql_Python Mysql数据库操作,sql文件操作
- 她不讲武德,北航博士竟然把60年来的文本分类综述都整理了!!!
- 如何获取屏幕分辨率呢
- C语言实现任意进制的转换,主要注意代码的小技巧
- DevOps使用教程 华为云(14)持续集成 流水线 自动化测试 怎么用
- WebView 简单使用方法
- jsp实验报告(一)
- 如何使用PowerShell批量删除注册表项
- ESP32 micropython 应用填坑(一):蓝牙
- python中cls和self的区别
- TXSQL:云计算时代数据库核弹头——云+未来峰会开发者专场回顾 1
- Partial RenderPartial Action RenderAction 区别和用法
- [深度学习笔记(1)]深度学习入门
- [心得]google软件工程师技术准备
- 【English】十大词性之连词
热门文章
- 电影TS、TC、SCR、R5/、BD、HD等版本是什么意思?
- 最老程序员创业札记:全文检索、数据挖掘、推荐引擎应用42
- 线段树的建树 单点修改 区间查询
- 如何对一年级小学生进行养成教育
- 【Pytorch】torch.Tensor.expand_as()与torch.Tensor.expand()使用与比较
- Ubuntu16.04安装VSCode,并修改系统界面和编辑面板字体大小
- 群晖开启root权限及修复Moments的AI人像服务
- 鸿蒙之始 那个软件能播,智能电视安装这几款直播软件就够了,全是HD画质,还支持回看!...
- 具备统一门户功能的内网即时通讯软件才是发展趋势
- python是什么意思,Python怎么读