浅谈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 Web框架Flask中使用新浪SAE云存储实例
Feb 08 Python
Python使用MYSQLDB实现从数据库中导出XML文件的方法
May 11 Python
浅谈Python类的__getitem__和__setitem__特殊方法
Dec 25 Python
python将ansible配置转为json格式实例代码
May 15 Python
Python+selenium实现自动循环扔QQ邮箱漂流瓶
May 29 Python
python 遍历列表提取下标和值的实例
Dec 25 Python
python接口自动化(十七)--Json 数据处理---一次爬坑记(详解)
Apr 18 Python
Python 实现还原已撤回的微信消息
Jun 18 Python
使用opencv将视频帧转成图片输出
Dec 10 Python
安装pyecharts1.8.0版本后导入pyecharts模块绘图时报错: “所有图表类型将在 v1.9.0 版本开始强制使用 ChartItem 进行数据项配置 ”的解决方法
Aug 18 Python
基于Python组装jmx并调用JMeter实现压力测试
Nov 03 Python
用python批量下载apk
Dec 29 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
人族 TERRAN 概述
2020/03/14 星际争霸
DC《小丑》11项提名领跑奥斯卡 Netflix成第92届奥斯卡提名最大赢家
2020/04/09 欧美动漫
中国收音机工业发展史
2021/03/02 无线电
PHP Header用于页面跳转要注意的几个问题总结
2008/10/03 PHP
PHP中预定义的6种接口介绍
2015/05/12 PHP
Yii中CGridView禁止列排序的设置方法
2016/07/12 PHP
微信公众平台开发教程⑥ 微信开发集成类的使用图文详解
2019/04/10 PHP
通过JAVAScript实现页面自适应
2007/01/19 Javascript
Extjs 几个方法的讨论
2010/01/28 Javascript
JavaScript对象、属性、事件手册集合方便查询
2010/07/04 Javascript
jquery为页面增加快捷键示例
2014/01/31 Javascript
JS合并数组的几种方法及优劣比较
2014/09/19 Javascript
详解Javascript动态操作CSS
2014/12/08 Javascript
JS中如何实现复选框全选功能
2016/12/19 Javascript
JS利用cookies设置每隔24小时弹出框
2017/04/20 Javascript
关于jQuery.ajax()的jsonp碰上post详解
2017/07/02 jQuery
Vue中computed、methods与watch的区别总结
2019/04/10 Javascript
jquery+css3实现的经典弹出层效果示例
2020/05/16 jQuery
[00:32]2018DOTA2亚洲邀请赛出场——VP
2018/04/04 DOTA
python 装饰器功能以及函数参数使用介绍
2012/01/27 Python
一个小示例告诉你Python语言的优雅之处
2014/07/04 Python
Python 微信之获取好友昵称并制作wordcloud的实例
2019/02/21 Python
python各类经纬度转换的实例代码
2019/08/08 Python
Html5实现单张、多张图片上传功能
2019/04/28 HTML / CSS
美国最大的在线水培用品商店:GrowersHouse.com
2018/08/14 全球购物
新东方旗下远程教育网站:新东方在线
2020/03/19 全球购物
2013英文求职信模板范文
2013/11/15 职场文书
旅游管理专业大学生职业规划书
2014/02/27 职场文书
项目建议书怎么写
2014/05/15 职场文书
拒绝黄毒毒宣传标语
2014/06/26 职场文书
大学生联谊活动策划书(光棍节)
2014/10/10 职场文书
实习协议书
2015/01/27 职场文书
课文《燕子》教学反思
2016/02/17 职场文书
网络新闻该怎么写?这些写作技巧你都知道吗?
2019/08/26 职场文书
css height属性中的calc方法详解
2021/06/03 HTML / CSS
Redis 彻底禁用RDB持久化操作
2021/07/09 Redis