浅谈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 相关文章推荐
Django集成百度富文本编辑器uEditor攻略
Jul 04 Python
python实现斐波那契递归函数的方法
Sep 08 Python
python解析xml文件操作实例
Oct 05 Python
python在html中插入简单的代码并加上时间戳的方法
Oct 16 Python
python中PS 图像调整算法原理之亮度调整
Jun 28 Python
快速解决vue.js 模板和jinja 模板冲突的问题
Jul 26 Python
django框架使用views.py的函数对表进行增删改查内容操作详解【models.py中表的创建、views.py中函数的使用,基于对象的跨表查询】
Dec 12 Python
pyinstaller还原python代码过程图解
Jan 08 Python
基于Pycharm加载多个项目过程图解
Jan 19 Python
keras模型保存为tensorflow的二进制模型方式
May 25 Python
python3将变量输入的简单实例
Aug 19 Python
Python使用scapy模块发包收包
May 07 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/04/09 魔兽争霸
自制汽车收音机天线:收听广播的技巧和方法
2021/03/02 无线电
php自定义分页类完整实例
2015/12/25 PHP
js获取变量
2006/08/24 Javascript
Javascript 原型和继承(Prototypes and Inheritance)
2009/04/01 Javascript
jQuery提交表单ajax查询实例代码
2012/10/07 Javascript
两个数组去重的JS代码
2013/12/04 Javascript
javascript函数定义的几种区别小结
2014/01/06 Javascript
浅谈JavaScript中setInterval和setTimeout的使用问题
2015/08/01 Javascript
JS+HTML5实现上传图片预览效果完整实例【测试可用】
2017/04/20 Javascript
vuejs手把手教你写一个完整的购物车实例代码
2017/07/06 Javascript
浅谈webpack下的AOP式无侵入注入
2017/11/12 Javascript
JavaScript ES6箭头函数使用指南
2018/12/30 Javascript
vue实现微信二次分享以及自定义分享的示例
2019/03/20 Javascript
node事件循环和process模块实例分析
2020/02/14 Javascript
原生JavaScript实现轮播图
2021/01/10 Javascript
[49:21]TNC vs VG 2019DOTA2国际邀请赛淘汰赛 胜者组赛BO3 第三场 8.20.mp4
2019/08/22 DOTA
Python用Pillow(PIL)进行简单的图像操作方法
2017/07/07 Python
Python爬虫实现“盗取”微信好友信息的方法分析
2019/09/16 Python
python中time库的实例使用方法
2019/10/31 Python
三个python爬虫项目实例代码
2019/12/28 Python
为什么说python更适合树莓派编程
2020/07/20 Python
HTML5之SVG 2D入门1—SVG(可缩放矢量图形)概述
2013/01/30 HTML / CSS
Lenox官网:精美的瓷器&独特的礼品
2017/02/12 全球购物
英国家电购物网站:Sonic Direct
2019/03/26 全球购物
以下的初始化有什么区别
2013/12/16 面试题
OSPF有什么优点?为什么OSPF比RIP收敛快?
2013/02/13 面试题
音乐学个人的自荐书范文
2013/11/26 职场文书
医药个人求职信范文
2014/01/29 职场文书
环保口号大全
2014/06/12 职场文书
公安机关纪律作风整顿剖析
2014/10/10 职场文书
个人先进事迹材料范文
2014/12/29 职场文书
2015年幼师个人工作总结
2015/10/15 职场文书
不要在HTML中滥用div
2021/05/08 HTML / CSS
Golang中异常处理机制详解
2021/06/08 Golang
Python中 range | np.arange | np.linspace三者的区别
2022/03/22 Python