浅谈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-基础-入门 简介
Aug 09 Python
详解Python网络爬虫功能的基本写法
Jan 28 Python
Python入门_浅谈for循环、while循环
May 16 Python
特征脸(Eigenface)理论基础之PCA主成分分析法
Mar 13 Python
python随机取list中的元素方法
Apr 08 Python
python3+requests接口自动化session操作方法
Oct 13 Python
python 解决动态的定义变量名,并给其赋值的方法(大数据处理)
Nov 10 Python
python实现发送form-data数据的方法详解
Sep 27 Python
Python API自动化框架总结
Nov 12 Python
Python如何使用argparse模块处理命令行参数
Dec 11 Python
详解python百行有效代码实现汉诺塔小游戏(简约版)
Oct 30 Python
Python实现异步IO的示例
Nov 05 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
javascript数组与php数组的地址传递及值传递用法实例
2015/01/22 PHP
php一个解析字符串排列数组的方法
2015/05/12 PHP
浅谈PHP的数据库接口和技术
2016/12/09 PHP
Yii2 批量插入、更新数据实例
2017/03/15 PHP
PNG背景在不同浏览器下的应用
2009/06/22 Javascript
在VS2008中使用jQuery智能感应的方法
2010/12/30 Javascript
JS教程:window.location使用方法的区别介绍
2013/10/04 Javascript
HTML,CSS,JavaScript速查表推荐
2014/12/02 Javascript
使用js实现数据格式化
2014/12/03 Javascript
将JavaScript的jQuery库中表单转化为JSON对象的方法
2015/11/17 Javascript
JS中的phototype详解
2017/02/04 Javascript
Bootstrap fileinput组件封装及使用详解
2017/03/10 Javascript
webpack打包单页面如何引用的js
2017/06/07 Javascript
jQuery dateRangePicker插件使用方法详解
2017/07/28 jQuery
Vue实现购物车场景下的应用
2017/11/27 Javascript
JS实现获取数组中最大值或最小值功能示例
2019/03/02 Javascript
JavaScript装饰者模式原理与用法实例详解
2020/03/09 Javascript
[38:27]完美世界DOTA2联赛PWL S2 Forest vs FTD.C 第二场 11.26
2020/11/30 DOTA
python文件读写操作与linux shell变量命令交互执行的方法
2015/01/14 Python
Flask框架Flask-Login用法分析
2018/07/23 Python
python中单例常用的几种实现方法总结
2018/10/13 Python
Appium+python自动化之连接模拟器并启动淘宝APP(超详解)
2019/06/17 Python
安装docker-compose的两种最简方法
2019/07/30 Python
python之列表推导式的用法
2019/11/29 Python
pytorch构建多模型实例
2020/01/15 Python
python实现秒杀商品的微信自动提醒功能(代码详解)
2020/04/27 Python
幼儿园实习生辞职信
2014/01/20 职场文书
检讨书范文300字
2015/01/28 职场文书
2016读书月活动心得体会
2016/01/14 职场文书
《火烧云》教学反思
2016/02/23 职场文书
教你如何用python开发一款数字推盘小游戏
2021/04/14 Python
聊聊golang中多个defer的执行顺序
2021/05/08 Golang
教你利用python实现企业微信发送消息
2021/05/23 Python
python之np.argmax()及对axis=0或者1的理解
2021/06/02 Python
MySQL令人大跌眼镜的隐式转换
2021/08/23 MySQL
vue递归实现树形组件
2022/07/15 Vue.js