浅谈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中pycurl库的用法实例
Sep 30 Python
python搜索指定目录的方法
Apr 29 Python
Python使用Mechanize模块编写爬虫的要点解析
Mar 31 Python
tf.truncated_normal与tf.random_normal的详细用法
Mar 05 Python
对pandas的层次索引与取值的新方法详解
Nov 06 Python
在win64上使用bypy进行百度网盘文件上传功能
Jan 02 Python
基于Python计算圆周率pi代码实例
Mar 25 Python
Python selenium使用autoIT上传附件过程详解
May 26 Python
解决keras使用cov1D函数的输入问题
Jun 29 Python
Django windows使用Apache实现部署流程解析
Oct 12 Python
python使用PySimpleGUI设置进度条及控件使用
Jun 10 Python
python中的装饰器该如何使用
Jun 18 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
将兴奋、喜悦和坎加斯带到戴安娜:亚马逊公主
2020/03/03 欧美动漫
对text数据类型不支持代码页转换 从: 1252 到: 936
2011/04/23 PHP
php格式化日期和时间格式化示例分享
2014/02/24 PHP
php判断页面是否是微信打开的示例(微信打开网页)
2014/04/25 PHP
Discuz7.2版的faq.php SQL注入漏洞分析
2014/08/06 PHP
QQ互联一键登录审核不通过的解决方案
2014/09/10 PHP
php的ZipArchive类用法实例
2014/10/20 PHP
PHP中使用匿名函数操作数据库的例子
2014/11/17 PHP
memcache一致性hash的php实现方法
2015/03/05 PHP
PHP实现获取并生成数据库字典的方法
2016/05/04 PHP
浅谈javascript的原型继承
2012/07/25 Javascript
Javascript new Date().valueOf()的作用与时间戳由来详解
2013/04/24 Javascript
浅析Js中的单引号与双引号问题
2013/11/06 Javascript
从零学JSON之JSON数据结构
2014/05/19 Javascript
如何让浏览器支持jquery ajax load 前进、后退功能
2014/06/12 Javascript
网站接入QQ登录的两种方法
2014/07/22 Javascript
js在指定位置增加节点函数insertBefore()用法实例
2015/01/12 Javascript
jQuery统计指定子元素数量的方法
2015/03/17 Javascript
jQuery树形下拉菜单特效代码分享
2015/08/15 Javascript
JS事件添加和移出的兼容写法示例
2016/06/20 Javascript
Sortable.js拖拽排序使用方法解析
2016/11/04 Javascript
js canvas实现二维码和图片合成的海报
2020/11/19 Javascript
vant 解决tab切换插件标题样式自定义的问题
2020/11/13 Javascript
Python3.x和Python2.x的区别介绍
2013/02/12 Python
Python-基础-入门 简介
2014/08/09 Python
keras的siamese(孪生网络)实现案例
2020/06/12 Python
iframe跨域的几种常用方法
2019/11/11 HTML / CSS
HTML5给汉字加拼音收起展开组件的实现代码
2020/04/08 HTML / CSS
中国跨境在线时尚零售商:Bellelily
2018/04/06 全球购物
植村秀美国官网:Shu Uemura美国
2019/03/19 全球购物
opencv实现图像几何变换
2021/03/24 Python
授权委托书样本
2014/04/03 职场文书
2015年仓库工作总结
2015/04/09 职场文书
乔布斯辞职信(中英文对照)
2015/05/12 职场文书
正确使用MySQL INSERT INTO语句
2021/05/26 MySQL
详解Python中下划线的5种含义
2021/07/15 Python