浅谈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提取html文件中的特定数据的实现代码
Mar 24 Python
python简单实现计算过期时间的方法
Jun 09 Python
Python中functools模块的常用函数解析
Jun 30 Python
解决pycharm运行出错,代码正确结果不显示的问题
Nov 30 Python
Python实现的读取文件内容并写入其他文件操作示例
Apr 09 Python
python可视化爬虫界面之天气查询
Jul 03 Python
从列表或字典创建Pandas的DataFrame对象的方法
Jul 06 Python
Win10系统下安装labelme及json文件批量转化方法
Jul 30 Python
Django自定义模板过滤器和标签的实现方法
Aug 21 Python
python with语句的原理与用法详解
Mar 30 Python
Python同时迭代多个序列的方法
Jul 28 Python
Python的Tqdm模块实现进度条配置
Feb 24 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 生成的XML以FLASH获取为乱码终极解决
2009/08/07 PHP
php 生成文字png图片的代码
2011/04/17 PHP
PHP内核介绍及扩展开发指南―基础知识
2011/09/11 PHP
PHP无刷新上传文件实现代码
2011/09/19 PHP
php使用NumberFormatter格式化货币的方法
2015/03/21 PHP
PHP微信模板消息操作示例
2017/06/29 PHP
PHP7变量处理机制修改
2021/03/09 PHP
JavaScript 入门基础知识 想学习js的朋友可以参考下
2009/12/26 Javascript
JQuery $.each遍历JavaScript数组对象实例
2014/09/01 Javascript
原生JS实现响应式瀑布流布局
2015/04/02 Javascript
jQuery+PHP+MySQL二级联动下拉菜单实例讲解
2015/10/27 Javascript
javascript中json基础知识详解
2017/01/19 Javascript
jQuery选择器之子元素选择器详解
2017/09/18 jQuery
微信小程序中遇到的iOS兼容性问题小结
2018/11/14 Javascript
微信小程序picker组件关于objectArray数据类型的绑定方法
2019/03/13 Javascript
如何修改Vue打包后文件的接口地址配置的方法
2020/04/22 Javascript
pygame播放音乐的方法
2015/05/19 Python
python抽象基类用法实例分析
2015/06/04 Python
在MAC上搭建python数据分析开发环境
2016/01/26 Python
python 文件操作删除某行的实例
2017/09/04 Python
Python实现通过继承覆盖方法示例
2018/07/02 Python
python使用sessions模拟登录淘宝的方式
2019/08/16 Python
Pytorch之parameters的使用
2019/12/31 Python
Python编程快速上手——疯狂填词程序实现方法分析
2020/02/29 Python
python能开发游戏吗
2020/06/11 Python
python调用摄像头的示例代码
2020/09/28 Python
Expedia挪威官网:酒店、机票和租车
2018/03/03 全球购物
深圳茁壮笔试题
2015/05/28 面试题
单位成立周年感言
2014/01/26 职场文书
《火烧云》教学反思
2014/04/12 职场文书
社团活动总结格式
2014/08/29 职场文书
2015年度公共机构节能工作总结
2015/05/26 职场文书
安全生产会议制度
2015/08/06 职场文书
2016大学迎新晚会开场白
2015/11/24 职场文书
2016年优秀团员事迹材料
2016/02/25 职场文书
nginx rewrite功能使用场景分析
2022/05/30 Servers