浅谈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错误处理详解
Sep 28 Python
详解Python中的正则表达式的用法
Apr 09 Python
Python操作Word批量生成文章的方法
Jul 28 Python
python3.6使用pymysql连接Mysql数据库
May 25 Python
Python get获取页面cookie代码实例
Sep 12 Python
在Mac下使用python实现简单的目录树展示方法
Nov 01 Python
3分钟学会一个Python小技巧
Nov 23 Python
PIL图像处理模块paste方法简单使用详解
Jul 17 Python
Django实现简单网页弹出警告代码
Nov 15 Python
python代码如何实现余弦相似性计算
Feb 09 Python
Python使用多进程运行含有任意个参数的函数
May 02 Python
python集合能干吗
Jul 19 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
用Zend Studio+PHPnow+Zend Debugger搭建PHP服务器调试环境步骤
2014/01/19 PHP
php中count获取多维数组长度的方法
2014/11/03 PHP
jQuery对象和DOM对象相互转化
2009/04/24 Javascript
原生JS操作网页给p元素添加onclick事件及表格隔行变色
2013/12/01 Javascript
jquery选择器简述
2015/08/31 Javascript
开启BootStrap学习之旅
2016/05/04 Javascript
原生js实现放大镜
2017/02/20 Javascript
jquery 手势密码插件
2017/03/17 Javascript
浅谈react+es6+webpack的基础配置
2017/08/09 Javascript
JS实现将二维数组转为json格式字符串操作示例
2018/07/12 Javascript
Mpvue中使用Vant Weapp组件库的方法步骤
2019/05/16 Javascript
vue中node_modules中第三方模块的修改使用详解
2019/05/31 Javascript
layui原生表单验证的实例
2019/09/09 Javascript
python计算牛顿迭代多项式实例分析
2015/05/07 Python
浅谈用Python实现一个大数据搜索引擎
2017/11/28 Python
Python中list查询及所需时间计算操作示例
2018/06/21 Python
Python实现对字典分别按键(key)和值(value)进行排序的方法分析
2018/12/19 Python
Python pycharm 同时加载多个项目的方法
2019/01/17 Python
基于python框架Scrapy爬取自己的博客内容过程详解
2019/08/05 Python
500行代码使用python写个微信小游戏飞机大战游戏
2019/10/16 Python
Python数据存储之 h5py详解
2019/12/26 Python
Python中的sys.stdout.write实现打印刷新功能
2020/02/21 Python
pyqt5 QlistView列表显示的实现示例
2020/03/24 Python
浅谈django 模型类使用save()方法的好处与注意事项
2020/03/28 Python
美国在线面料商店:Online Fabric Store
2018/07/26 全球购物
全球高级音频和视频专家:HiDef Lifestyle
2019/08/02 全球购物
英国领先的独立酒精饮料零售商:DrinkSupermarket
2021/01/13 全球购物
单位刻章介绍信范文
2014/01/11 职场文书
小学生倡议书范文
2014/05/13 职场文书
商场父亲节活动方案
2014/08/27 职场文书
北京天坛导游词
2015/02/12 职场文书
2015初中政治教学工作总结
2015/07/21 职场文书
高一语文教学反思
2016/02/16 职场文书
jQuery ajax - getScript() 方法和getJSON方法
2021/05/14 jQuery
Django分页器的用法你都了解吗
2021/05/26 Python
关于nginx 实现jira反向代理的问题
2021/09/25 Servers