浅谈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基础之I/O模型
May 11 Python
Python3自动签到 定时任务 判断节假日的实例
Nov 13 Python
python实现K近邻回归,采用等权重和不等权重的方法
Jan 23 Python
对python For 循环的三种遍历方式解析
Feb 01 Python
使用 Python 玩转 GitHub 的贡献板(推荐)
Apr 04 Python
全面了解django的缓存机制及使用方法
Jul 22 Python
windows 10 设定计划任务自动执行 python 脚本的方法
Sep 11 Python
python之array赋值技巧分享
Nov 28 Python
matplotlib quiver箭图绘制案例
Apr 17 Python
Anaconda的安装及其环境变量的配置详解
Apr 22 Python
详解pandas绘制矩阵散点图(scatter_matrix)的方法
Apr 23 Python
Python xlrd模块导入过程及常用操作
Jun 10 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
给ECShop添加最新评论
2015/01/07 PHP
php银联网页支付实现方法
2015/03/04 PHP
Laravel 5 框架入门(一)
2015/04/09 PHP
Ajax和PHP正则表达式验证表单及验证码
2016/09/24 PHP
ThinkPHP删除栏目(实现批量删除栏目)
2017/06/21 PHP
javascript jscroll模拟html元素滚动条
2012/12/18 Javascript
js调用AJAX时Get和post的乱码解决方法
2013/06/04 Javascript
使用js操作css实现js改变背景图片示例
2014/03/10 Javascript
javascript去除字符串中所有标点符号和提取纯文本的正则
2014/06/07 Javascript
一个JavaScript递归实现反转数组字符串的实例
2014/10/14 Javascript
JavaScript中的ubound函数使用实例
2014/11/04 Javascript
基于jquery animate操作css样式属性小结
2015/11/27 Javascript
实例详解AngularJS实现无限级联动菜单
2016/01/15 Javascript
Javascript仿京东放大镜的效果
2017/03/01 Javascript
angular学习之从零搭建一个angular4.0项目
2017/07/10 Javascript
vue音乐播放器插件vue-aplayer的配置及其使用实例详解
2017/07/10 Javascript
JS中双击和单击事件冲突的解决方法
2018/04/09 Javascript
浅谈Vue使用Elementui修改默认的最快方法
2020/12/05 Vue.js
django自定义Field实现一个字段存储以逗号分隔的字符串
2014/04/27 Python
Python按行读取文件的简单实现方法
2016/06/22 Python
Kali Linux安装ipython2 和 ipython3的方法
2019/07/11 Python
Python学习笔记之While循环用法分析
2019/08/14 Python
Python3 使用selenium插件爬取苏宁商家联系电话
2019/12/23 Python
Python利用 utf-8-sig 编码格式解决写入 csv 文件乱码问题
2020/02/21 Python
python中有帮助函数吗
2020/06/19 Python
详解Html5中video标签那些属性和方法
2019/07/01 HTML / CSS
html5的canvas方法使用指南
2014/12/15 HTML / CSS
唤醒头发毛囊的秘密武器:Grow Gorgeous
2016/08/28 全球购物
Carter’s OshKosh加拿大:购买婴幼儿服装和童装
2018/11/27 全球购物
经济信息管理专业大学生求职信
2013/09/27 职场文书
高中美术教学反思
2014/01/19 职场文书
初一体育教学反思
2014/01/29 职场文书
群众路线问题查摆对照检查材料
2014/10/04 职场文书
医院领导班子查摆问题对照检查材料思想汇报
2014/10/08 职场文书
忠诚教育学习心得体会
2016/01/23 职场文书
Node-Red实现MySQL数据库连接的方法
2021/08/07 MySQL