浅谈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抽象基类用法实例分析
Jun 04 Python
Python自动化运维和部署项目工具Fabric使用实例
Sep 18 Python
Python3用tkinter和PIL实现看图工具
Jun 21 Python
Python调用adb命令实现对多台设备同时进行reboot的方法
Oct 15 Python
为什么你还不懂得怎么使用Python协程
May 13 Python
python 反编译exe文件为py文件的实例代码
Jun 27 Python
django多对多表的创建,级联删除及手动创建第三张表
Jul 25 Python
python实现两个文件夹的同步
Aug 29 Python
Python 50行爬虫抓取并处理图灵书目过程详解
Sep 20 Python
python实现提取str字符串/json中多级目录下的某个值
Feb 27 Python
Python3开发实例之非关系型图数据库Neo4j安装方法及Python3连接操作Neo4j方法实例
Mar 18 Python
Python ckeditor富文本编辑器代码实例解析
Jun 22 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读取txt文件组成SQL并插入数据库的代码(原创自Zjmainstay)
2012/07/31 PHP
php+mysql实现的二级联动菜单效果详解
2016/05/10 PHP
深入理解PHP类的自动载入机制
2016/09/16 PHP
thinkphp框架表单数组实现图片批量上传功能示例
2020/04/04 PHP
CSS常用网站布局实例
2008/04/03 Javascript
JavaScript 读取元素的CSS信息的代码
2010/02/07 Javascript
JavaScript DOM 学习第二章 编辑文本
2010/02/19 Javascript
autoPlay 基于jquery的图片自动播放效果
2011/12/07 Javascript
javascript不同类型数据之间的运算的转换方法
2014/02/13 Javascript
jquery分页对象使用示例
2014/04/01 Javascript
基于Jquery实现万圣节快乐特效
2015/11/01 Javascript
jQuery简单创建节点的方法
2016/09/09 Javascript
jQuery实现下拉菜单的实例代码
2017/06/19 jQuery
使用Webpack提高Vue.js应用的方式汇总(四种)
2017/07/10 Javascript
AngularJS实现图片上传和预览功能的方法分析
2017/11/08 Javascript
深入理解Angularjs 脏值检测
2018/10/12 Javascript
vue.draggable实现表格拖拽排序效果
2018/12/01 Javascript
angular中两种表单的区别(响应式和模板驱动表单)
2018/12/06 Javascript
vue路由对不同界面进行传参及跳转的总结
2019/04/20 Javascript
微信小程序发布新版本时自动提示用户更新的方法
2019/06/07 Javascript
python 合并文件的具体实例
2013/08/08 Python
python使用tensorflow深度学习识别验证码
2018/04/03 Python
浅谈python requests 的put, post 请求参数的问题
2019/01/02 Python
pyautogui自动化控制鼠标和键盘操作的步骤
2020/04/01 Python
如何基于Python爬取隐秘的角落评论
2020/07/02 Python
用Python 爬取猫眼电影数据分析《无名之辈》
2020/07/24 Python
Django静态文件加载失败解决方案
2020/08/26 Python
基于python实现百度语音识别和图灵对话
2020/11/02 Python
Django web自定义通用权限控制实现方法
2020/11/24 Python
C语言笔试题回忆
2015/04/02 面试题
就业自我评价
2014/02/04 职场文书
运动会入场词50字
2014/02/20 职场文书
青年志愿者先进事迹
2014/05/06 职场文书
综治工作心得体会
2014/09/11 职场文书
react 项目中引入图片的几种方式
2021/06/02 Javascript
weblogic服务建立数据源连接测试更新mysql驱动包的问题及解决方法
2022/01/22 MySQL