python类定义(浅谈python新式类和旧式类区别)
python类定义
浅谈python新式类和旧式类区别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算法是采用深度优先搜索
新式类相同父类只执行一次构造函数,经典类重复执行多次。
其中:
- 截止到python2.1,只存在旧式类。旧式类中,类名和type是无关的:如果x是一个旧式类,那么x.__class__定义了x的类名,但是type(x)总是返回<type 'instance'>。这反映了所有的旧式类的实例是通过一个单一的叫做instance的内建类型来实现的,这是它和类不同的地方。
- 新式类是在python2.2为了统一类和实例引入的。一个新式类只能由用户自定义。如果x是一个新式类的实例,那么type(x)和x.__class__是一样的结果(尽管这不能得到保证,因为新式类的实例的__class__方法是允许被用户覆盖的)。
- python 2.x中默认都是经典类,只有显式继承了object才是新式类
- 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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持开心学习网。
原文链接:https://www.pythontab.com/html/2015/pythonjichu_1113/982.html
- python类的init方法(Python操作配置文件ini的三种方法讲解)
- python 模块详解(举例讲解Python常用模块)
- python中for循环计算1-100(python 用for循环实现1~n求和的实例)
- python读取word的表格(Python使用reportlab模块生成PDF格式的文档)
- python 串口图形化(python使用MQTT给硬件传输图片的实现方法)
- python 游戏开发实例(python实现诗歌游戏类继承)
- python创建文件夹(python批量创建指定名称的文件夹)
- pythonexcel生成报表(python生成每日报表数据Excel并邮件发送的实例)
- python中统计一个字符出现的次数(Python统计一个字符串中每个字符出现了多少次的方法字符串转换为列表再统计)
- pythonredis使用场景(python redis 删除key脚本的实例)
- python循环语句嵌套使用(Python分支语句与循环语句应用实例分析)
- python实现购物网站(Python实战购物车项目的实现参考)
- python循环创建字典(Python字典的基本用法实例分析创建、增加、获取、修改、删除)
- python 获取ip mac 地址(Python3获取电脑IP、主机名、Mac地址的方法示例)
- python指定参数教程(详解Python传入参数的几种方法)
- python把str转成list(python3 字符串/列表/元组str/list/tuple相互转换方法及join函数的使用)
- 鱼竿 夏钓短,冬钓长 ,一定是这样 认清优缺点在选竿(鱼竿夏钓短冬钓长)
- 鲢鳙钓底还是钓浮 流水的水域应怎样做钓(鲢鳙钓底还是钓浮)
- 入秋后的第二场苹果发布会来了 全新M1系列芯片登场(入秋后的第二场苹果发布会来了)
- 苹果正式发布自研芯片M1 5nm 32核心 彻底放弃Intel(苹果正式发布自研芯片M1)
- 苹果自研芯片跑分对比 A16芯片排名靠后,M1系列霸榜(苹果自研芯片跑分对比)
- X86处理器的梦魇 苹果M1自研芯片到底有多强(苹果M1自研芯片到底有多强)
热门推荐
- sqlserver查看表和存储过程的架构(SQL Server 远程更新目标表数据的存储过程)
- Html.ActionLink的用法
- mysql 索引怎么实现(Mysql中索引和约束的示例语句)
- vue实现列表向上滚动更新(vue实现列表无缝滚动)
- 常见的几种XSS攻击
- python怎么设置matlab编程(实例详解Matlab 与 Python 的区别)
- dockerpull下来的容器存放位置(详解docker pull下来的镜像存储在哪里)
- php面向对象教程理解(PHP面向对象程序设计之构造方法和析构方法详解)
- django session验证(Django框架验证码用法实例分析)
- css3特性动画图(CSS3轻松实现清新 Loading 效果的简单实例)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9