浅谈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 GUI实例学习
Nov 21 Python
一个月入门Python爬虫学习,轻松爬取大规模数据
Jan 03 Python
对python PLT中的image和skimage处理图片方法详解
Jan 10 Python
关于Pycharm无法debug问题的总结
Jan 19 Python
Python数据类型之Tuple元组实例详解
May 08 Python
python实现接口并发测试脚本
Jun 25 Python
Django 过滤器汇总及自定义过滤器使用详解
Jul 19 Python
python实现图片压缩代码实例
Aug 12 Python
使用Python获取当前工作目录和执行命令的位置
Mar 09 Python
VSCode配合pipenv搞定虚拟环境的实现方法
May 17 Python
pandas 操作 Excel操作总结
Mar 31 Python
如何Python使用re模块实现okenizer
Apr 30 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
模拟OICQ的实现思路和核心程序(三)
2006/10/09 PHP
dedecms 批量提取第一张图片最为缩略图的代码(文章+软件)
2009/10/29 PHP
PHP函数篇详解十进制、二进制、八进制和十六进制转换函数说明
2011/12/05 PHP
php获取QQ头像并显示的方法
2014/12/23 PHP
PHP入门教程之数组用法汇总(创建,删除,遍历,排序等)
2016/09/11 PHP
PHP用户验证和标签推荐的简单使用
2016/10/31 PHP
yii框架结合charjs统计上一年与当前年数据的方法示例
2020/04/04 PHP
jquery 图片预加载 自动等比例缩放插件
2008/12/25 Javascript
IE 上下滚动展示模仿Marquee机制
2009/12/20 Javascript
Jquery插件写法笔记整理
2012/09/06 Javascript
JavaScript组件开发之输入框加候选框
2017/03/10 Javascript
vue使用i18n实现国际化的方法详解
2019/09/05 Javascript
JavaScript实现图片轮播特效
2019/10/23 Javascript
vue指令v-html使用过滤器filters功能实例
2019/10/25 Javascript
python实现windows下文件备份脚本
2018/05/27 Python
python pygame模块编写飞机大战
2018/11/20 Python
Django 中间键和上下文处理器的使用
2019/03/17 Python
为什么你还不懂得怎么使用Python协程
2019/05/13 Python
python装饰器原理与用法深入详解
2019/12/19 Python
python计算导数并绘图的实例
2020/02/29 Python
pyecharts动态轨迹图的实现示例
2020/04/17 Python
tensorflow常用函数API介绍
2020/04/19 Python
使用Python实现批量ping操作方法
2020/05/06 Python
Python爬虫中Selenium实现文件上传
2020/12/04 Python
利用CSS3实现开门效果实例源码
2016/08/22 HTML / CSS
欧缇丽英国官方网站:Caudalie英国
2016/08/17 全球购物
NOTINO英国:在线购买美容和香水
2020/02/25 全球购物
岗位职责的定义
2013/11/10 职场文书
中秋节主持词
2014/04/02 职场文书
广播节目策划方案
2014/05/23 职场文书
《周恩来的四个昼夜》观后思想汇报范文两篇
2014/09/10 职场文书
2014年大学宣传部工作总结
2014/12/19 职场文书
使用Html+Css实现简易导航栏功能(导航栏遇到鼠标切换背景颜色)
2021/04/07 HTML / CSS
Python调用腾讯API实现人脸身份证比对功能
2022/04/04 Python
MySQL实现字段分割一行转多行的示例代码
2022/07/07 MySQL
win10滚动条自动往上跑怎么办?win10滚动条自动往上跑的解决方法
2022/08/05 数码科技