浅谈python之新式类


Posted in Python onAugust 12, 2018

前言

本文中代码运行的python版本一律采取2.7.13

科普:

经典类:classic class

新式类:new-style class

  1. python2.2 之前并没有新式类
  2. python2.2-2.7 新式类与经典类并存, 默认使用经典类, 除非显式继承object
  3. python3.X 中去除了经典类, 用户定义的所有类都隐式继承自object

 如何使用新式类

class New(object): # 显式继承object类
 pass

class Old: 
 pass
  
class Old2():
 pass

上述代码中的3种定义类的方法, 只有第一种方法定义的是新式类.

新式类VS经典类 

新式类与经典类最主要的区别在于继承顺序, 事实上, 对于用户定义的每一个类, python 都会计算出一个方法解析顺序(Method Resolution Order, MRO)列表,它代表了类继承的顺序, 而由于经典类与新式类采用的算法不一致, 相同的继承关系可能会出现不一样的MRO列表.

import inspect
class D:
  pass
 
class C(D):
  pass 
 
class B(D):
  pass
 
class A(B, C):
  pass  

print inspect.getmro(A)
# (<class __main__.A at 0x000000000322BB88>, 
# <class __main__.B at 0x000000000322B9A8>, 
# <class __main__.D at 0x000000000322BC48>, 
# <class __main__.C at 0x000000000322B948>)

class D(object):
  pass
 
class C(D):
  pass
 
class B(D):
  pass
 
class A(B, C):
  pass

print inspect.getmro(A)

# (<class '__main__.A'>, 
<class '__main__.B'>, 
<class '__main__.C'>, 
<class '__main__.D'>, 
<type 'object'>)

可以看到, 经典类的MRO顺序A-B-D-C 与新式类的MRO顺序 A-B-C-D-object 是存在差异的, 这可能会是我们日常会遇到的坑.

而除了继承顺序的差异, 新式类还添加了内置属性__slots__

一般来说, 每个实例都有一个字典来管理实例的属性, 我们可以用__dict__ 来查看(__dict__并不保存类属性),它允许我们动态地修改实例的属性, 但是这也意味着每个实例都会有1个独立的字典需要我们去维护, 当我们需要创建大量的实例时, 这个操作是十分消耗内存的.

当我们在定义类时添加了__slots__属性后, 对象在实例化时就不会创建字典来管理实例属性, 而实例只能定义在__slots__里边已经设定好的属性名, 不允许动态添加其他未在__slots__里定义的属性

class Student(object):
 __slots__ = ('id', 'name', 'gender')
 def exam(self):
  pass

s1 = Student()
'__dict__' in dir(s1) # False
s1.id = 10001
s1.class = 1 
# AttributeError: 'Student' object has no attribute 'class'

def func():
 pass

s1.exam = func 
# AttributeError: 'Student' object attribute 'f' is read-only

使用__slots__ 后我们不再能够动态地修改实例的属性, 那么使用__slots__究竟有什么好处呢?

优点:
 1.节省内存
 2.提高属性访问速度

缺点:
 1.不能动态修改实例属性

当然, 除了继承顺序和__slots__, 新式类添加了__getattribute__方法, 还修改了实例的类型

class New(object):
 pass
 
class Old:
 pass
 
new = New()
old = Old()
print(new)
# <__main__.New object at 0x0000000003262208>
print(old)
# <__main__.Old instance at 0x000000000321C6C8>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python重新引入被覆盖的自带function
Jul 16 Python
使用Protocol Buffers的C语言拓展提速Python程序的示例
Apr 16 Python
Python实现向服务器请求压缩数据及解压缩数据的方法示例
Jun 09 Python
Python实现可自定义大小的截屏功能
Jan 20 Python
详解从Django Rest Framework响应中删除空字段
Jan 11 Python
对python中的try、except、finally 执行顺序详解
Feb 18 Python
Python批量修改图片分辨率的实例代码
Jul 04 Python
PYTHON EVAL的用法及注意事项解析
Sep 06 Python
感知器基础原理及python实现过程详解
Sep 30 Python
Python3 Click模块的使用方法详解
Feb 12 Python
Keras Convolution1D与Convolution2D区别说明
May 22 Python
python调用百度API实现人脸识别
Nov 17 Python
详解Django中类视图使用装饰器的方式
Aug 12 #Python
python中pip的安装与使用教程
Aug 10 #Python
python3判断url链接是否为404的方法
Aug 10 #Python
Python实现数据可视化看如何监控你的爬虫状态【推荐】
Aug 10 #Python
Selenium元素的常用操作方法分析
Aug 10 #Python
Selenium定位元素操作示例
Aug 10 #Python
判断python字典中key是否存在的两种方法
Aug 10 #Python
You might like
PHP中strtotime函数使用方法分享
2012/01/10 PHP
ThinkPHP表单数据智能写入create方法实例分析
2015/09/27 PHP
PHP数据对象PDO操作技巧小结
2016/09/27 PHP
Laravel框架Blade模板简介及模板继承用法分析
2019/12/03 PHP
JQuery的Alert消息框插件使用介绍
2010/10/09 Javascript
统计出现最多的字符次数的js代码
2010/12/03 Javascript
读jQuery之十二 删除事件核心方法
2011/07/31 Javascript
js实现上传图片之上传前预览图片
2013/03/25 Javascript
JavaScript实现url地址自动检测并添加URL链接示例代码
2013/11/12 Javascript
jquery中post方法用法实例
2014/10/21 Javascript
JavaScript Math.ceil 方法(对数值向上取整)
2015/01/09 Javascript
在JavaScript中正确引用bind方法的应用
2015/05/11 Javascript
JavaScript中循环遍历Array与Map的方法小结
2016/03/12 Javascript
nodejs 的 session 简单使用
2016/06/06 NodeJs
jQuery UI结合Ajax创建可定制的Web界面
2016/06/22 Javascript
vue.js学习之递归组件
2016/12/13 Javascript
jQuery编写设置和获取颜色的插件
2017/01/09 Javascript
详谈js中数组(array)和对象(object)的区别
2017/02/27 Javascript
Es6 Generator函数详细解析
2018/02/24 Javascript
jQuery pjax 应用简单示例
2018/09/20 jQuery
详解使用React.memo()来优化函数组件的性能
2019/03/19 Javascript
了解JavaScript表单操作和表单域
2019/05/27 Javascript
JQuery常用简单动画操作方法回顾与总结
2019/12/07 jQuery
js观察者模式的弹幕案例
2020/11/23 Javascript
python多个模块py文件的数据共享实例
2019/01/11 Python
pytorch 在网络中添加可训练参数,修改预训练权重文件的方法
2019/08/17 Python
python常用排序算法的实现代码
2019/11/08 Python
Python TKinter如何自动关闭主窗口
2020/02/26 Python
Html5上传图片 移动端、PC端通用代码
2016/06/08 HTML / CSS
Java提供了哪些企业应用编程接口
2015/02/13 面试题
《中彩那天》教学反思
2014/02/22 职场文书
工作会议主持词
2014/03/17 职场文书
营销总监岗位职责
2014/09/16 职场文书
迟到检讨书范文
2015/01/27 职场文书
Nginx的rewrite模块详解
2021/03/31 Servers
Python使用psutil库对系统数据进行采集监控的方法
2021/08/23 Python