浅谈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 相关文章推荐
Swift 3.0在集合类数据结构上的一些新变化总结
Jul 11 Python
django实现登录时候输入密码错误5次锁定用户十分钟
Nov 05 Python
python socket网络编程之粘包问题详解
Apr 28 Python
无法使用pip命令安装python第三方库的原因及解决方法
Jun 12 Python
Python requests模块实例用法
Feb 11 Python
Python写一个基于MD5的文件监听程序
Mar 11 Python
从0开始的Python学习016异常
Apr 08 Python
详解如何管理多个Python版本和虚拟环境
May 10 Python
python并发编程 Process对象的其他属性方法join方法详解
Aug 20 Python
pytorch中的transforms模块实例详解
Dec 31 Python
python中time、datetime模块的使用
Dec 14 Python
python urllib和urllib3知识点总结
Feb 08 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+mysql实现用户注册登陆的方法
2015/01/03 PHP
php连接微软MSSQL(sql server)完全攻略
2016/11/27 PHP
php实现查询功能(数据访问)
2017/05/23 PHP
jQuery select控制插件
2009/08/17 Javascript
jsTree树控件(基于jQuery, 超强悍)[推荐]
2009/09/01 Javascript
用最通俗易懂的代码帮助新手理解javascript闭包 推荐
2012/03/01 Javascript
js调用后台、后台调用前台等方法总结
2014/04/17 Javascript
javascript实现无缝上下滚动特效
2015/12/16 Javascript
JavaScript中双符号的运算详解
2017/03/12 Javascript
NodeJs模拟登陆正方教务
2017/04/28 NodeJs
JS装饰器函数用法总结
2018/04/21 Javascript
webpack dll打包重复问题优化的解决
2018/10/10 Javascript
详解微信小程序缓存--缓存时效性
2019/05/02 Javascript
Python下的twisted框架入门指引
2015/04/15 Python
简单介绍Python中的round()方法
2015/05/15 Python
Python实现的简单算术游戏实例
2015/05/26 Python
Python开发之快速搭建自动回复微信公众号功能
2016/04/22 Python
python一行sql太长折成多行并且有多个参数的方法
2018/07/19 Python
python存储16bit和32bit图像的实例
2018/12/05 Python
python自动发邮件总结及实例说明【推荐】
2019/05/31 Python
python中append实例用法总结
2019/07/30 Python
docker django无法访问redis容器的解决方法
2019/08/21 Python
TensorFlow实现checkpoint文件转换为pb文件
2020/02/10 Python
Python爬取365好书中小说代码实例
2020/02/28 Python
详解用Python进行时间序列预测的7种方法
2020/03/13 Python
西班牙第一的网上药房:PromoFarma.com
2017/04/17 全球购物
PHP如何防止SQL注入
2014/05/03 面试题
采购部主管岗位职责
2014/01/01 职场文书
关于毕业的中学校园广播稿
2014/01/26 职场文书
国家助学金获奖感言
2014/01/31 职场文书
公务员考察材料范文
2014/12/23 职场文书
劳模先进事迹材料
2014/12/24 职场文书
2015国庆节宣传语
2015/07/14 职场文书
初中信息技术教学反思
2016/02/16 职场文书
2019年“我为祖国点赞”演讲稿(3篇)
2019/09/26 职场文书
在vue中import()语法不能传入变量的问题及解决
2022/04/01 Vue.js