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简易版学生管理系统(python3.6实现学生信息管理系统)
- pythonrequest包设置编码(解决python3中的requests解析中文页面出现乱码问题)
- python3循环使用教程(Python3.4学习笔记之 idle 清屏扩展插件用法分析)
- python爬虫10分钟教程(浅谈Python爬虫基本套路)
- python列表切片和分片(Python列表切片操作实例总结)
- python连接到本地的mysql数据库(Python实现连接MySql数据库及增删改查操作详解)
- pythonselenium判断网页加载完成(python 实现selenium断言和验证的方法)
- python多线程有两个参数怎么传(python从子线程中获得返回值的方法)
- python socket 库(Pythony运维入门之Socket网络编程详解)
- python怎么给rsa加密(Python生成rsa密钥对操作示例)
- python渗透攻击(Python实现DDos攻击实例详解)
- python模块光照强度(我如何用 CircuitPython 和开源工具监控温室)
- python使用门算法加密文件(python实现可逆简单的加密算法)
- python中匿名函数关键字(浅谈python之高阶函数和匿名函数)
- python起源详解(Python发展简史 Python来历)
- python中jieba库怎么用(详解Python数据可视化编程 - 词云生成并保存jieba+WordCloud)
- 美国数十万加仑牛奶倒入下水道,贫民区食不果腹,历史再次重演(美国数十万加仑牛奶倒入下水道)
- 美国倒掉数十万加仑牛奶 上热搜第一,这一幕似曾相识(美国倒掉数十万加仑牛奶)
- 深度 倒牛奶 这一幕为何又在美国上演(深度倒牛奶)
- 美国数十万加仑牛奶倒下水道怎么回事 原因曝光令人心痛(美国数十万加仑牛奶倒下水道怎么回事)
- 探索中国神秘文字(探索中国神秘文字)
- 重温《蜗居》 宋思明选中海藻为红颜知己,纯属巧合,与爱无关(宋思明选中海藻为红颜知己)
热门推荐
- python初学者必备函数(Python小白必备的8个最常用的内置函数推荐)
- postgresql docker 宿主机(本地Docker安装Postgres 12 + pgadmin的方法 支持Apple M1)
- python设置按钮(Python按钮的响应事件详解)
- 如何把阿里云盘加入到快捷操作(阿里云如何挂载数据盘?阿里云挂载数据盘一键脚本)
- python 读文件报错处理(解决python写入带有中文的字符到文件错误的问题)
- dedecms循环次数(DedeCMS 统计栏目的文章总数的调用方法)
- 虚拟主机值不值得买(购买虚拟主机10个注意事项)
- docker启动指定容器ip(Docker每次启动容器,IP及hosts指定的操作)
- mysql语句运行顺序(浅谈mysql执行过程以及顺序)
- SQL中的with as的使用
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9