浅谈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求解水仙花数的方法
May 11 Python
Python常用算法学习基础教程
Apr 13 Python
使用python 爬虫抓站的一些技巧总结
Jan 10 Python
Sanic框架基于类的视图用法示例
Jul 18 Python
Python 类方法和实例方法(@classmethod),静态方法(@staticmethod)原理与用法分析
Sep 20 Python
Python常用编译器原理及特点解析
Mar 23 Python
Python super()方法原理详解
Mar 31 Python
Python-opencv实现红绿两色识别操作
Jun 04 Python
如何解决cmd运行python提示不是内部命令
Jul 01 Python
Python开发入门——迭代的基本使用
Sep 03 Python
基于Python制作一副扑克牌过程详解
Oct 19 Python
Python中else的三种使用场景
Jun 16 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
IIS环境下快速安装、配置和调试PHP5.2.0
2006/12/17 PHP
php下实现伪 url 的超简单方法[转]
2007/09/24 PHP
php实现检查文章是否被百度收录
2015/01/27 PHP
jValidate 基于jQuery的表单验证插件
2009/12/12 Javascript
jquery实用代码片段集合
2010/08/12 Javascript
40款非常棒的jQuery 插件和制作教程(系列二)
2011/11/02 Javascript
浏览器的JavaScript引擎的识别方法
2013/10/20 Javascript
JS复制到剪贴板示例代码
2013/10/30 Javascript
JQuery解析HTML、JSON和XML实例详解
2014/03/29 Javascript
Js Jquery创建一个弹出层可加载一个页面
2014/05/08 Javascript
JavaScript DOM 学习总结(五)
2015/11/24 Javascript
vue.js指令v-for使用及索引获取
2016/11/03 Javascript
JS实现密码框的显示密码和隐藏密码功能示例
2016/12/26 Javascript
javascript循环链表之约瑟夫环的实现方法
2017/01/16 Javascript
使用Vue-Router 2实现路由功能实例详解
2017/11/14 Javascript
Vue动态创建注册component的实例代码
2019/06/14 Javascript
在Layui中实现开关按钮的效果实例
2019/09/29 Javascript
js中火星坐标、百度坐标、WGS84坐标转换实现方法示例
2020/03/02 Javascript
react antd表格中渲染一张或多张图片的实例
2020/10/28 Javascript
javascript实现点击小图显示大图
2020/11/29 Javascript
学习python的几条建议分享
2013/02/10 Python
Python使用logging结合decorator模式实现优化日志输出的方法
2016/04/16 Python
python生成随机图形验证码详解
2017/11/08 Python
Python实现自定义函数的5种常见形式分析
2018/06/16 Python
使用Python实现图像标记点的坐标输出功能
2019/08/14 Python
python应用文件读取与登录注册功能
2019/09/23 Python
python3.7通过thrift操作hbase的示例代码
2020/01/14 Python
Python类class参数self原理解析
2020/11/19 Python
CSS3 @font-face属性使用指南
2014/12/12 HTML / CSS
联想C++笔试题
2012/06/13 面试题
部队学习十八大感言
2014/01/11 职场文书
婚前保证书
2014/04/29 职场文书
教师国庆节演讲稿范文2014
2014/09/21 职场文书
2014小学年度工作总结
2014/12/20 职场文书
[有人@你]你有一封绿色倡议书,请查收!
2019/07/18 职场文书
python 逐步回归算法
2021/04/06 Python