浅谈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实现的批量下载RFC文档
Mar 10 Python
python简单实现基于SSL的IRC bot实例
Jun 15 Python
python 表达式和语句及for、while循环练习实例
Jul 07 Python
Python实现在线暴力破解邮箱账号密码功能示例【测试可用】
Sep 06 Python
python实现画圆功能
Jan 25 Python
Django+JS 实现点击头像即可更改头像的方法示例
Dec 26 Python
Python实现的栈、队列、文件目录遍历操作示例
May 06 Python
了解不常见但是实用的Python技巧
May 23 Python
利用python中集合的唯一性实现去重
Feb 11 Python
如何使用Python进行PDF图片识别OCR
Jan 22 Python
通用的Django注册功能模块实现方法
Feb 05 Python
python实现不同数据库间数据同步功能
Feb 25 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
cache_lite试用
2007/02/14 PHP
用PHP代替JS玩转DOM的思路及示例代码
2014/06/15 PHP
php实现将字符串按照指定距离进行分割的方法
2015/03/14 PHP
PHP 双链表(SplDoublyLinkedList)简介和使用实例
2015/05/12 PHP
如何让动态插入的javascript脚本代码跑起来。
2007/01/09 Javascript
没有document.getElementByName方法
2013/08/19 Javascript
JavaScript获取多个数组的交集简单实例
2013/11/11 Javascript
可插入图片的TEXT文本框
2013/12/27 Javascript
jQuery制作拼图小游戏
2015/01/12 Javascript
JavaScript学习笔记之JS函数
2015/01/22 Javascript
jquery+php随机生成红包金额数量代码分享
2015/08/27 Javascript
高效的jquery数字滚动特效
2015/12/17 Javascript
jQuery中trigger()与bind()用法分析
2015/12/18 Javascript
js轮盘抽奖实例分析
2020/04/17 Javascript
ES6中Symbol类型用法实例详解
2017/04/06 Javascript
vue移动端下拉刷新和上拉加载的实现代码
2018/09/08 Javascript
详解jQuery中的getAll()和cleanData()
2019/04/15 jQuery
在Vue mounted方法中使用data变量详解
2019/11/05 Javascript
[04:19]完美世界携手游戏风云打造 卡尔工作室模型介绍篇
2013/04/24 DOTA
Python使用爬虫猜密码
2016/02/19 Python
简单谈谈python中的多进程
2016/11/06 Python
TensorFlow实现Softmax回归模型
2018/03/09 Python
django请求返回不同的类型图片json,xml,html的实例
2018/05/22 Python
python使用python-pptx删除ppt某页实例
2020/02/14 Python
python+selenium+chromedriver实现爬虫示例代码
2020/04/10 Python
HTML5 在canvas中绘制文本附效果图
2014/06/23 HTML / CSS
英国在线玫瑰专家:InterRose
2019/12/01 全球购物
值传递还是引用传递
2015/02/08 面试题
创业大赛策划书
2014/03/01 职场文书
爱情保证书大全
2014/04/29 职场文书
党支部半年考察意见
2015/06/01 职场文书
2019让人心动的商业计划书
2019/06/27 职场文书
为什么在foreach循环中JAVA集合不能添加或删除元素
2021/06/11 Java/Android
小程序与后端Java接口交互实现HelloWorld入门
2021/07/09 Java/Android
实战 快速定位MySQL的慢SQL
2022/03/22 MySQL
苹果发布了MagSafe固件更新,可以不外接电源实现最高7.5W充电
2022/04/21 数码科技