浅谈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编程时利用wxPython来支持多线程的方法
Apr 07 Python
python下读取公私钥做加解密实例详解
Mar 29 Python
Python框架Flask的基本数据库操作方法分析
Jul 13 Python
Python解析Excle文件中的数据方法
Oct 23 Python
numpy向空的二维数组中添加元素的方法
Nov 01 Python
使用python来调用CAN通讯的DLL实现方法
Jul 03 Python
Python中filter与lambda的结合使用详解
Dec 24 Python
python GUI库图形界面开发之PyQt5日期时间控件QDateTimeEdit详细使用方法与实例
Feb 27 Python
python logging.info在终端没输出的解决
May 12 Python
python怎么调用自己的函数
Jul 01 Python
Pytho爬虫中Requests设置请求头Headers的方法
Sep 22 Python
OpenCV图像变换之傅里叶变换的一些应用
Jul 26 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初学者的8点有效建议
2010/11/20 PHP
php操作csv文件代码实例汇总
2014/09/22 PHP
PHP使用ffmpeg给视频增加字幕显示的方法
2015/03/12 PHP
详解php中serialize()和unserialize()函数
2017/07/08 PHP
js自带函数备忘 数组
2006/12/29 Javascript
javascript 客户端验证上传图片的大小(兼容IE和火狐)
2009/08/15 Javascript
网页禁用右键实现代码(JavaScript代码)
2009/10/29 Javascript
JS小框架 fly javascript framework
2009/11/26 Javascript
40款非常棒的jQuery 插件和制作教程(系列一)
2011/10/26 Javascript
js模拟点击以提交表单为例兼容主流浏览器
2013/11/29 Javascript
JavaScript实现大数的运算
2014/11/24 Javascript
Bootstrap每天必学之导航条
2015/11/27 Javascript
客户端验证用户名和密码的方法详解
2016/06/16 Javascript
JS中的==运算: [''] == false —&gt;true
2016/07/24 Javascript
AngularJS深入探讨scope,继承结构,事件系统和生命周期
2016/11/02 Javascript
js 获取本地文件及目录的方法(推荐)
2016/11/10 Javascript
读Javascript高性能编程重点笔记
2016/12/21 Javascript
w3c编程挑战_初级脚本算法实战篇
2017/06/23 Javascript
element的el-table中记录滚动条位置的示例代码
2019/11/06 Javascript
JS实现秒杀倒计时特效
2020/01/02 Javascript
JS数据类型(基本数据类型、引用数据类型)及堆和栈的区别分析
2020/03/04 Javascript
剖析Python的Tornado框架中session支持的实现代码
2015/08/21 Python
Python while 循环使用的简单实例
2016/06/08 Python
python中numpy包使用教程之数组和相关操作详解
2017/07/30 Python
Python 变量类型详解
2018/10/10 Python
python 实现UTC时间加减的方法
2018/12/31 Python
澳大利亚儿童和婴儿产品在线商店:Lime Tree Kids
2017/10/05 全球购物
从当地商店送来的杂货:Instacart
2018/08/19 全球购物
安全协议书范本
2014/04/21 职场文书
初二学习计划书范文
2014/04/27 职场文书
员工试用期自我鉴定范文
2014/09/15 职场文书
运动会广播稿200字(10篇)
2014/10/12 职场文书
小平您好观后感
2015/06/09 职场文书
保险公司2016开门红口号集锦
2015/12/24 职场文书
MySql新手入门的基本操作汇总
2021/05/13 MySQL
RPM包方式安装Oracle21c的方法详解
2021/08/23 Oracle