浅谈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如何调用C/C++底层库与互相传值
Aug 10 Python
python中使用正则表达式的后向搜索肯定模式(推荐)
Nov 11 Python
浅析python中的迭代与迭代对象
Oct 08 Python
Matplotlib中文乱码的3种解决方案
Nov 15 Python
pandas求两个表格不相交的集合方法
Dec 08 Python
Python后台开发Django的教程详解(启动)
Apr 08 Python
详解PyTorch手写数字识别(MNIST数据集)
Aug 16 Python
Python 实现取多维数组第n维的前几位
Nov 26 Python
浅谈pandas.cut与pandas.qcut的使用方法及区别
Mar 03 Python
基于FME使用Python过程图解
May 13 Python
Python答题卡识别并给出分数的实现代码
Jun 22 Python
python 进阶学习之python装饰器小结
Sep 04 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
从零开始的异世界生活:第二季延期后,B站上架了第二部剧场版
2020/05/06 日漫
php生成缩略图的类代码
2008/10/02 PHP
114啦源码(114la)不能生成地方房产和地方报刊问题4级页面0字节的解决方法
2012/01/12 PHP
手把手编写PHP框架 深入了解MVC运行流程
2016/09/19 PHP
thinkphp制作404跳转页的简单实现方法
2016/09/22 PHP
PHP处理Ajax请求与Ajax跨域问题
2017/02/13 PHP
js可突破windows弹退效果代码
2008/08/09 Javascript
javascript options属性集合操作代码
2009/12/28 Javascript
10个基于Jquery的幻灯片插件教程
2010/10/29 Javascript
JQuery与Ajax调用新浪API获取短网址的代码
2014/02/07 Javascript
JavaScript函数定义的常见注意事项小结
2014/09/16 Javascript
jQuery中outerWidth()方法用法实例
2015/01/19 Javascript
jQuery Mobile框架中的表单组件基础使用教程
2016/05/17 Javascript
jQuery禁用快捷键例如禁用F5刷新 禁用右键菜单等的简单实现
2016/08/31 Javascript
angular仿支付宝密码框输入效果
2017/03/25 Javascript
ionic2.0双击返回键退出应用
2019/09/17 Javascript
让IDE识别webpack的别名alias的实现方法
2020/05/06 Javascript
Vue项目如何引入bootstrap、elementUI、echarts
2020/11/26 Vue.js
[01:45]绝对公平!DOTA2队长征召模式详解
2014/04/25 DOTA
[52:09]2014 DOTA2华西杯精英邀请赛 5 25 NewBee VS DK第二场
2014/05/26 DOTA
爬山算法简介和Python实现实例
2014/04/26 Python
python使用win32com库播放mp3文件的方法
2015/05/30 Python
详解JavaScript编程中的window与window.screen对象
2015/10/26 Python
python异常和文件处理机制详解
2016/07/19 Python
python实现简单登陆流程的方法
2018/04/22 Python
Python中创建二维数组
2018/10/17 Python
Python Django基础二之URL路由系统
2019/07/18 Python
python继承threading.Thread实现有返回值的子类实例
2020/05/02 Python
在keras 中获取张量 tensor 的维度大小实例
2020/06/10 Python
医学专业五年以上个人求职信
2013/12/03 职场文书
《木笛》教学反思
2014/03/01 职场文书
2014年小学植树节活动方案
2014/03/02 职场文书
中学校庆方案
2014/03/17 职场文书
党员活动日总结
2014/05/05 职场文书
HTML怎么设置下划线?html文字加下划线方法
2021/12/06 HTML / CSS
RestTemplate如何通过HTTP Basic Auth认证示例说明
2022/03/17 Java/Android