浅谈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实现自动更换ip的方法
May 05 Python
Python实现matplotlib显示中文的方法详解
Feb 06 Python
python爬虫爬取淘宝商品信息
Feb 23 Python
python 遍历pd.Series的index和value
Nov 26 Python
Python reshape的用法及多个二维数组合并为三维数组的实例
Feb 07 Python
基于python实现模拟数据结构模型
Jun 12 Python
Python改变对象的字符串显示的方法
Aug 01 Python
python实现自动清理重复文件
Aug 24 Python
基于Python爬取51cto博客页面信息过程解析
Aug 25 Python
Python 实现PS滤镜中的径向模糊特效
Dec 03 Python
python openssl模块安装及用法
Dec 06 Python
python编程实现清理微信重复缓存文件
Nov 01 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
PHP5新特性: 更加面向对象化的PHP
2006/11/18 PHP
《PHP边学边教》(02.Apache+PHP环境配置――下篇)
2006/12/13 PHP
实用函数8
2007/11/08 PHP
php中smarty区域循环的方法
2015/06/11 PHP
WordPress中查询文章的循环Loop结构及用法分析
2015/12/17 PHP
PHP Socket网络操作类定义与用法示例
2017/08/30 PHP
iframe自适应宽度、高度 ie6 7 8,firefox 3.86下测试通过
2010/07/29 Javascript
js 弹出菜单/窗口效果
2011/10/30 Javascript
Jquery.addClass始终无效原因分析
2013/09/08 Javascript
TypeScript具有的几个不同特质
2015/04/07 Javascript
jQuery添加和删除指定标签的方法
2015/12/16 Javascript
Bootstrap组件系列之福利篇几款好用的组件(推荐)
2016/06/23 Javascript
vue2.0获取自定义属性的值
2017/03/28 Javascript
前端主流框架vue学习笔记第二篇
2017/07/26 Javascript
Nodejs 复制文件/文件夹的方法
2017/08/24 NodeJs
对Angular中单向数据流的深入理解
2018/03/31 Javascript
jquery轻量级数字动画插件countUp.js使用详解
2019/10/17 jQuery
vue商城中商品“筛选器”功能的实现代码
2020/07/01 Javascript
pygame学习笔记(2):画点的三种方法和动画实例
2015/04/15 Python
python判断给定的字符串是否是有效日期的方法
2015/05/13 Python
Scrapy框架使用的基本知识
2018/10/21 Python
python创建文件时去掉非法字符的方法
2018/10/31 Python
python读取大文件越来越慢的原因与解决
2019/08/08 Python
原来我一直安装 Python 库的姿势都不对呀
2019/11/11 Python
Flask框架搭建虚拟环境的步骤分析
2019/12/21 Python
python爬虫爬取监控教务系统的思路详解
2020/01/08 Python
Python Selenium参数配置方法解析
2020/01/19 Python
CSS3实现背景透明文字不透明的示例代码
2018/06/25 HTML / CSS
某IT外企面试题-二分法求方程!看看大家的C++功底
2015/07/04 面试题
经济信息管理专业大学生求职信
2013/09/27 职场文书
实习自我评价怎么写
2013/12/02 职场文书
家长对孩子的评语
2014/04/18 职场文书
教师四风问题整改措施
2014/09/25 职场文书
企业投资意向书
2015/05/09 职场文书
python scipy 稀疏矩阵的使用说明
2021/05/26 Python
「魔导具师妲莉亚永不妥协~从今天开始的自由职人生活~」1、2卷发售宣传CM公开
2022/03/21 日漫