浅谈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实现简单点对点(p2p)聊天
Sep 13 Python
Python实现的读取电脑硬件信息功能示例
May 30 Python
python爬取指定微信公众号文章
Dec 20 Python
python爬虫租房信息在地图上显示的方法
May 13 Python
Python函数中的可变长参数详解
Sep 12 Python
Python for循环与getitem的关系详解
Jan 02 Python
VScode连接远程服务器上的jupyter notebook的实现
Apr 23 Python
python中有函数重载吗
May 28 Python
为什么说python适合写爬虫
Jun 11 Python
Matlab求解数组中的最大值及它所在的具体位置
Apr 16 Python
如何用 Python 子进程关闭 Excel 自动化中的弹窗
May 07 Python
Python的property属性详细讲解
Apr 11 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
Nginx下ThinkPHP5的配置方法详解
2017/08/01 PHP
PHP文字转图片功能原理与实现方法分析
2017/08/31 PHP
PHP实现的二分查找算法实例分析
2017/12/19 PHP
jquery实现多级下拉菜单的实例代码
2013/10/02 Javascript
JavaScript学习笔记之内置对象
2015/01/22 Javascript
jQuery实现仿路边灯箱广告图片轮播效果
2015/04/15 Javascript
简介JavaScript中substring()方法的使用
2015/06/06 Javascript
JavaScript中Object.prototype.toString方法的原理
2016/02/24 Javascript
jQuery easyUI datagrid 增加求和统计行的实现代码
2016/06/01 Javascript
JS实现title标题栏文字不间断滚动显示效果
2016/09/07 Javascript
Bootstrap模态框禁用空白处点击关闭
2016/10/20 Javascript
探究JavaScript中的五种事件处理程序方式
2016/12/07 Javascript
Vue.js实战之使用Vuex + axios发送请求详解
2017/04/04 Javascript
JS与jQuery实现子窗口获取父窗口元素值的方法
2017/04/17 jQuery
微信小程序之前台循环数据绑定
2017/08/18 Javascript
vue实现某元素吸顶或固定位置显示(监听滚动事件)
2017/12/13 Javascript
基于vue 实现token验证的实例代码
2017/12/14 Javascript
[01:18]DOTA2超级联赛专访hanci ForLove淘汰感言曝光
2013/06/04 DOTA
win7 下搭建sublime的python开发环境的配置方法
2014/06/18 Python
Python中声明只包含一个元素的元组数据方法
2014/08/25 Python
python选择排序算法实例总结
2015/07/01 Python
基于Python3 逗号代码 和 字符图网格(详谈)
2017/06/22 Python
Python中协程用法代码详解
2018/02/10 Python
Python PyQt4实现QQ抽屉效果
2018/04/20 Python
详解pytorch 0.4.0迁移指南
2019/06/16 Python
使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件及出现问题解决方法
2019/09/06 Python
python之pymysql模块简单应用示例代码
2019/12/16 Python
利用HTML5 Canvas制作一个简单的打飞机游戏
2015/05/11 HTML / CSS
丝芙兰巴西官方商城:SEPHORA巴西
2016/10/31 全球购物
埃弗顿足球俱乐部官方网上商店:Everton Direct
2018/01/13 全球购物
澳大利亚家具和家居用品在线商店:Interiors Online
2018/03/05 全球购物
校园文化建设方案
2014/02/03 职场文书
应用数学专业求职信
2014/03/14 职场文书
报纸媒体创意广告词
2014/03/17 职场文书
卡特教练观后感
2015/06/08 职场文书
2016年中学植树节活动总结
2016/03/16 职场文书