浅谈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中常用操作字符串的函数与方法总结
Feb 04 Python
Python中列表与元组的乘法操作示例
Feb 10 Python
python opencv之SURF算法示例
Feb 24 Python
python中的文件打开与关闭操作命令介绍
Apr 26 Python
3个用于数据科学的顶级Python库
Sep 29 Python
Python中变量的输入输出实例代码详解
Jul 28 Python
python 实现dict转json并保存文件
Dec 05 Python
基于Python3.6中的OpenCV实现图片色彩空间的转换
Feb 03 Python
Python输出指定字符串的方法
Feb 06 Python
浅析python 定时拆分备份 nginx 日志的方法
Apr 27 Python
Django多层嵌套ManyToMany字段ORM操作详解
May 19 Python
Python OpenCV快速入门教程
Apr 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简单的伪原创程序,配合商城采集用的
2010/10/12 PHP
php对二维数组进行排序的简单实例
2013/12/19 PHP
PHP中批量生成静态html(命令行下运行PHP)
2014/04/19 PHP
php实现单笔转账到支付宝功能
2018/10/09 PHP
Laravel框架模型的创建及模型对数据操作示例
2019/05/07 PHP
漂亮的jquery提示效果(仿腾讯弹出层)
2013/02/05 Javascript
JavaScript使用FileSystemObject对象写入文本文件内容的方法
2015/08/05 Javascript
js精美的幻灯片画集特效代码分享
2015/08/29 Javascript
Nodejs实战心得之eventproxy模块控制并发
2015/10/27 NodeJs
举例讲解jQuery对DOM元素的向上遍历、向下遍历和水平遍历
2016/07/07 Javascript
jQuery代码优化方法总结
2018/01/29 jQuery
vue项目中公用footer组件底部位置的适配问题
2018/05/10 Javascript
Vue中android4.4不兼容问题的解决方法
2018/09/04 Javascript
IE9 elementUI文件上传的问题解决
2018/10/17 Javascript
微信小程序自定义单项选择器样式
2019/07/25 Javascript
原生JS与CSS实现软件卸载对话框功能
2019/12/05 Javascript
Javascript实现鼠标点击冒泡特效
2019/12/24 Javascript
vue-cli设置publicPath小记
2020/04/14 Javascript
Python CSV模块使用实例
2015/04/09 Python
django实现用户登陆功能详解
2017/12/11 Python
Win10 安装PyCharm2019.1.1(图文教程)
2019/09/29 Python
VSCode基础使用与VSCode调试python程序入门的图文教程
2020/03/30 Python
学python需要去培训机构吗
2020/07/01 Python
关于pycharm 切换 python3.9 报错 ‘HTMLParser‘ object has no attribute ‘unescape‘ 的问题
2020/11/24 Python
python 制作网站筛选工具(附源码)
2021/01/21 Python
我能否用void** 指针作为参数, 使函数按引用接受一般指针
2013/02/16 面试题
求职简历自荐信
2013/10/20 职场文书
2014全国两会心得体会
2014/03/17 职场文书
工商企业管理专业自荐信范文
2014/04/12 职场文书
2014年图书室工作总结
2014/12/09 职场文书
2014矛盾纠纷排查调处工作总结
2014/12/09 职场文书
2015年医生个人工作总结
2015/04/25 职场文书
Python机器学习三大件之一numpy
2021/05/10 Python
vue实现拖拽交换位置
2022/04/07 Vue.js
MySQL中的全表扫描和索引树扫描
2022/05/15 MySQL
Windows server 2022创建创建林、域树、子域的步骤
2022/06/25 Servers