浅谈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程序与MySQL的教程
Apr 29 Python
python统计日志ip访问数的方法
Jul 06 Python
python中reduce()函数的使用方法示例
Sep 29 Python
pandas系列之DataFrame 行列数据筛选实例
Apr 12 Python
python实现事件驱动
Nov 21 Python
对python PLT中的image和skimage处理图片方法详解
Jan 10 Python
Python3.6.x中内置函数总结及讲解
Feb 22 Python
PyQT实现菜单中的复制,全选和清空的功能的方法
Jun 17 Python
python实现文件的分割与合并
Aug 29 Python
Python 实现一行输入多个数字(用空格隔开)
Apr 29 Python
简述python&amp;pytorch 随机种子的实现
Oct 07 Python
分享3个非常实用的 Python 模块
Mar 03 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
smarty 原来也不过如此~~呵呵
2006/11/25 PHP
PHP使用mysql_fetch_object从查询结果中获取对象集的方法
2015/03/18 PHP
详解PHP中cookie和session的区别及cookie和session用法小结
2016/06/12 PHP
php rmdir使用递归函数删除非空目录实例详解
2016/10/20 PHP
jquery 页面全选框实践代码
2010/04/02 Javascript
js 获取、清空input type=&quot;file&quot;的值示例代码
2014/02/19 Javascript
JS实现距离上次刷新已过多少秒示例
2014/05/23 Javascript
javascript使用正则控制input输入框允许输入的值方法大全
2014/06/19 Javascript
JavaScript中神奇的call()方法
2015/03/12 Javascript
四种参数传递的形式——URL,超链接,js,form表单
2015/07/24 Javascript
JS的框架Polymer中的dom-if和is属性使用说明
2015/07/29 Javascript
Node.js+Express配置入门教程
2016/05/19 Javascript
js canvas实现放大镜查看图片功能
2017/06/08 Javascript
详解vue-router 路由元信息
2017/09/13 Javascript
js前端导出Excel的方法
2017/11/01 Javascript
浅析Angular19 自定义表单控件
2018/01/31 Javascript
Vue2.0用户权限控制解决方案的示例
2018/02/10 Javascript
说说Vuex的getters属性的具体用法
2019/04/15 Javascript
[06:33]3.19 DOTA2发布会 海涛、冷冷、2009见证希望
2014/03/21 DOTA
Python-基础-入门 简介
2014/08/09 Python
用Python生成器实现微线程编程的教程
2015/04/13 Python
Python中使用partial改变方法默认参数实例
2015/04/28 Python
Python打印斐波拉契数列实例
2015/07/07 Python
python中的文件打开与关闭操作命令介绍
2018/04/26 Python
DRF跨域后端解决之django-cors-headers的使用
2019/01/27 Python
通过cmd进入python的实例操作
2019/06/26 Python
您的健身减肥和健康饮食专家:vitafy
2017/06/06 全球购物
京东全球售:直邮香港,澳门,台湾,美国,澳大利亚等地区
2017/09/24 全球购物
英国高街奥特莱斯:Highstreet Outlet
2019/11/21 全球购物
教师业务学习制度
2014/01/25 职场文书
学生自我评价范文
2014/02/02 职场文书
高中学校对照检查材料
2014/08/31 职场文书
2014年企业员工工作总结
2014/12/09 职场文书
工资证明格式模板
2015/06/12 职场文书
position:sticky 粘性定位的几种巧妙应用详解
2021/04/24 HTML / CSS
Nginx设置HTTPS的方法步骤 443证书配置方法
2022/03/21 Servers