浅谈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 相关文章推荐
python正则匹配抓取豆瓣电影链接和评论代码分享
Dec 27 Python
在Python编程过程中用单元测试法调试代码的介绍
Apr 02 Python
python使用WMI检测windows系统信息、硬盘信息、网卡信息的方法
May 15 Python
Python统计文件中去重后uuid个数的方法
Jul 30 Python
Python使用itertools模块实现排列组合功能示例
Jul 02 Python
python turtle库画一个方格和圆实例
Jun 27 Python
深入了解Python iter() 方法的用法
Jul 11 Python
Python+OpenCV检测灯光亮点的实现方法
Nov 02 Python
pycharm远程连接服务器并配置python interpreter的方法
Dec 23 Python
python实现大文本文件分割成多个小文件
Apr 20 Python
关于Numpy之repeat、tile的用法总结
Jun 02 Python
Python探索生命起源 matplotlib细胞自动机动画演示
Apr 21 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设计模式 Prototype (原型模式)代码
2011/06/26 PHP
php实现的漂亮分页方法
2014/04/17 PHP
用js实现控制内容的向上向下滚动效果
2007/06/26 Javascript
Array.prototype.concat不是通用方法反驳[译]
2012/09/20 Javascript
web开发人员学习jQuery的6大理由及jQuery的优势介绍
2013/01/03 Javascript
无刷新预览所选择的图片示例代码
2014/04/02 Javascript
uploadify多文件上传参数设置技巧
2015/11/16 Javascript
浅谈javascript中onbeforeunload与onunload事件
2015/12/10 Javascript
推荐阅读的js快速判断IE浏览器(兼容IE10与IE11)
2015/12/13 Javascript
Vue.js组件tabs实现选项卡切换效果
2016/12/01 Javascript
jQuery文字轮播特效
2017/02/12 Javascript
AngularJS实现单一页面内设置跳转路由的方法
2017/06/28 Javascript
Bootstrap 模态对话框只加载一次 remote 数据的完美解决办法
2017/07/09 Javascript
js+css实现红包雨效果
2018/07/12 Javascript
服务端预渲染之Nuxt(使用篇)
2019/04/08 Javascript
vue2 中二级路由高亮问题及配置方法
2019/06/10 Javascript
p5.js临摹动态图形实现方法详解
2019/10/23 Javascript
JavaScript利用键盘码控制div移动
2020/03/19 Javascript
[48:46]完美世界DOTA2联赛PWL S2 SZ vs FTD.C 第二场 11.19
2020/11/19 DOTA
Python数据分析之双色球中蓝红球分析统计示例
2018/02/03 Python
python3利用venv配置虚拟环境及过程中的小问题小结
2018/08/01 Python
Python如何发布程序的详细教程
2018/10/09 Python
Python面向对象之类的封装操作示例
2019/06/08 Python
详解Python中的各种转义符\n\r\t
2019/07/10 Python
python并发爬虫实用工具tomorrow实用解析
2019/09/25 Python
解析HTML5中的新功能本地存储localStorage
2016/03/01 HTML / CSS
2014端午节活动策划方案
2014/01/27 职场文书
通信工程求职信
2014/07/16 职场文书
2014年党员自我评议对照检查材料
2014/09/20 职场文书
领导班子“四风问题”“整改方案
2014/10/02 职场文书
劳动保障个人工作总结
2015/03/04 职场文书
如何书写邀请函?
2019/06/24 职场文书
MySQL 外键约束和表关系相关总结
2021/06/20 MySQL
一次项目中Thinkphp绕过禁用函数的实战记录
2021/11/17 PHP
Win11查看设备管理器
2022/04/19 数码科技
Python使用pyecharts控件绘制图表
2022/06/05 Python