浅谈python新式类和旧式类区别


Posted in Python onApril 26, 2019

python的新式类是2.2版本引进来的,我们可以将之前的类叫做经典类或者旧式类。

为什么要在2.2中引进new style class呢?官方给的解释是:

为了统一类(class)和类型(type)。

在2.2之前,比如2.1版本中,类和类型是不同的,如a是ClassA的一个实例,那么a.__class__返回 ‘ class    __main__.ClassA‘ ,type(a)返回总是<type 'instance'>。而引入新类后,比如ClassB是个新类,b是ClassB的实例,b.__class__和type(b)都是返回‘class '__main__.ClassB' ,这样就统一了。

引入新类后,还有其他的好处,比如更多的内置属性将会引入,描述符的引入,属性可以来计算等等。

为了向前兼容,默认情况下用户定义的类为经典类,新类需要继承自所有类的基类 object 或者继承自object的新类。

值得注意的地方是,虽然使用的是最新的python(2.7),但是一些特性不会在旧式类起作用。

Python中类分两种:旧式类和新式类:

新式类都从object继承,经典类不需要。

新式类的MRO(method resolution order 基类搜索顺序)算法采用C3算法广度优先搜索,而旧式类的MRO算法是采用深度优先搜索

新式类相同父类只执行一次构造函数,经典类重复执行多次。

其中:

  1. 截止到python2.1,只存在旧式类。旧式类中,类名和type是无关的:如果x是一个旧式类,那么x.__class__定义了x的类名,但是type(x)总是返回<type 'instance'>。这反映了所有的旧式类的实例是通过一个单一的叫做instance的内建类型来实现的,这是它和类不同的地方。
  2. 新式类是在python2.2为了统一类和实例引入的。一个新式类只能由用户自定义。如果x是一个新式类的实例,那么type(x)和x.__class__是一样的结果(尽管这不能得到保证,因为新式类的实例的__class__方法是允许被用户覆盖的)。
  3. Python 2.x中默认都是经典类,只有显式继承了object才是新式类
  4. Python 3.x中默认都是新式类,经典类被移除,不必显式的继承object

所以,为了确保自己使用的是新式类,有两种以下方法:

1. 元类,在类模块代码的最前面加入如下代码 __metaclass__ = classname(自定义的某个新式类)。

2. 类都从内建类object直接或者间接地继承。

如果不需要兼容旧式类,旧版本的类,那么就保持都是新式类。

在Python3里面,不存在这些问题了,因为所有的类都是object类的子类(隐式)。

代码示例:

class oldClass:      #经典类
  def __init__( self ):
    pass
 
class newClass(object):  #新类
  def __init__( self ):
    pass 
 
c1 = oldClass()
c2 = newClass()
 
c1.__class__      # 输出-> <class __main__.oldClass at 0x0137BF10>
type(c1)        # 输出-> <type 'instance'>
 
c2.__class__      # 输出-><class '__main__.newClass'>
type(c2)        # 输出-><class '__main__.newClass'>

Python2.x中:

class A:
 pass
class B:
 pass
class C(B):
 pass
class D(C,A):
 pass

执行顺序为:D->C->B,->A

class A(object):
 pass
class B(object):
 pass
class C(object): 
 pass
class D(A,B,C): 
 pass

执行顺序为: D->A->B->C->Object

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
centos系统升级python 2.7.3
Jul 03 Python
python中pycurl库的用法实例
Sep 30 Python
Python下载懒人图库JavaScript特效
May 28 Python
Python中.py文件打包成exe可执行文件详解
Mar 22 Python
详解python中的线程
Feb 10 Python
python 读写excel文件操作示例【附源码下载】
Jun 19 Python
Python OpenCV中的resize()函数的使用
Jun 20 Python
pytorch AvgPool2d函数使用详解
Jan 03 Python
python 如何区分return和yield
Sep 22 Python
python 如何将两个实数矩阵合并为一个复数矩阵
May 19 Python
python 使用tkinter与messagebox写界面和弹窗
Mar 20 Python
Python+pyaudio实现音频控制示例详解
Jul 23 Python
Python静态类型检查新工具之pyright 使用指南
Apr 26 #Python
Python3中_(下划线)和__(双下划线)的用途和区别
Apr 26 #Python
详解Python爬取并下载《电影天堂》3千多部电影
Apr 26 #Python
Python 2/3下处理cjk编码的zip文件的方法
Apr 26 #Python
实例详解Matlab 与 Python 的区别
Apr 26 #Python
Python生成MD5值的两种方法实例分析
Apr 26 #Python
十个Python练手的实战项目,学会这些Python就基本没问题了(推荐)
Apr 26 #Python
You might like
PHP 可阅读随机字符串代码
2010/05/26 PHP
phpcms实现验证码替换及phpcms实现全站搜索功能教程详解
2017/12/13 PHP
PHP ADODB实现分页功能简单示例
2018/05/25 PHP
PHP封装的简单连接MongoDB类示例
2019/02/13 PHP
关于URL中的特殊符号使用介绍
2011/11/03 Javascript
异步javascript的原理和实现技巧介绍
2012/11/08 Javascript
jQuery实现单行文字间歇向上滚动源代码
2013/06/02 Javascript
jquery仿QQ商城带左右按钮控制焦点图片切换滚动效果
2013/06/27 Javascript
深入理解javascript中return的作用
2013/12/30 Javascript
微信小程序 数据访问实例详解
2016/10/08 Javascript
Bootstrap Modal遮罩弹出层(完整版)
2016/11/21 Javascript
Angular2-primeNG文件上传模块FileUpload使用详解
2017/01/14 Javascript
使用jQuery操作DOM的方法小结
2017/02/27 Javascript
jQuery实现分页功能(含ajax请求、后台数据、附完整demo)
2017/04/03 jQuery
AngularJS入门教程一:路由用法初探
2017/05/27 Javascript
Angular 4依赖注入学习教程之简介(一)
2017/06/04 Javascript
Angular 4 依赖注入学习教程之FactoryProvider的使用(四)
2017/06/04 Javascript
解决Vue+Element ui开发中碰到的IE问题
2018/09/03 Javascript
[49:08]Secret vs VP 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
python写的一个文本编辑器
2014/01/23 Python
python中私有函数调用方法解密
2016/04/29 Python
解决python2.7 查询mysql时出现中文乱码
2016/10/09 Python
win7上python2.7连接mysql数据库的方法
2017/01/14 Python
用十张图详解TensorFlow数据读取机制(附代码)
2018/02/06 Python
解决Python安装后pip不能用的问题
2018/06/12 Python
python操作excel让工作自动化
2019/08/09 Python
django创建css文件夹的具体方法
2020/07/31 Python
房地产融资计划书
2014/01/10 职场文书
计算机求职信
2014/07/02 职场文书
2014年幼儿园保育工作总结
2014/12/02 职场文书
2014年高数考试作弊检讨书
2014/12/14 职场文书
2015年党员个人自我评价
2015/03/03 职场文书
公司员工手册范本
2015/05/14 职场文书
关于公司年会的开幕词
2016/03/04 职场文书
Python下opencv使用hough变换检测直线与圆
2021/06/18 Python
pycharm代码删除恢复的方法
2021/06/26 Python