浅谈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使用socket远程连接错误处理方法
Apr 29 Python
python的paramiko模块实现远程控制和传输示例
Oct 13 Python
django实现同一个ip十分钟内只能注册一次的实例
Nov 03 Python
python批量修改图片大小的方法
Jul 24 Python
不到40行代码用Python实现一个简单的推荐系统
May 10 Python
Python批量生成幻影坦克图片实例代码
Jun 04 Python
详解python websocket获取实时数据的几种常见链接方式
Jul 01 Python
Python3.6实现根据电影名称(支持电视剧名称),获取下载链接的方法
Aug 26 Python
python通过对字典的排序,对json字段进行排序的实例
Feb 27 Python
Python 窗体(tkinter)下拉列表框(Combobox)实例
Mar 04 Python
教你用python实现一个无界面的小型图书管理系统
May 21 Python
教你怎么用Python selenium操作浏览器对象的基础API
Jun 23 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
一个简单的域名注册情况查询程序
2006/10/09 PHP
PHP EOT定界符的使用详解
2008/09/30 PHP
在Laravel中实现使用AJAX动态刷新部分页面
2019/10/15 PHP
二级域名或跨域共享Cookies的实现方法
2008/08/07 Javascript
js中的setInterval和setTimeout使用实例
2014/05/09 Javascript
JavaScript也谈内存优化
2014/06/06 Javascript
禁止iframe页面的所有js脚本如alert及弹出窗口等
2014/09/03 Javascript
基于jQuery实现选取月份插件附源码下载
2015/12/28 Javascript
Vue2.0实现购物车功能
2017/06/05 Javascript
webpack配置sass模块的加载的方法
2017/07/30 Javascript
浅谈vue-router2路由参数注意的问题
2017/11/08 Javascript
webpack多入口文件页面打包配置详解
2018/01/09 Javascript
jQuery AJAX 方法success()后台传来的4种数据详解
2018/08/08 jQuery
ES6基础之解构赋值(destructuring assignment)
2019/02/21 Javascript
layer iframe 设置关闭按钮的方法
2019/09/12 Javascript
vue实现弹幕功能
2019/10/25 Javascript
jQuery操作动画完整实例分析
2020/01/10 jQuery
python时间整形转标准格式的示例分享
2014/02/14 Python
python调用windows api锁定计算机示例
2014/04/17 Python
Python实现类继承实例
2014/07/04 Python
详解Python中的__new__、__init__、__call__三个特殊方法
2016/06/02 Python
python实现dijkstra最短路由算法
2019/01/17 Python
在pyqt5中QLineEdit里面的内容回车发送的实例
2019/06/21 Python
使用django的objects.filter()方法匹配多个关键字的方法
2019/07/18 Python
django中瀑布流写法实例代码
2019/10/14 Python
银行自荐信范文
2013/10/07 职场文书
水果超市创业计划书
2014/01/27 职场文书
《小猪家的桃花树》教学反思
2014/04/11 职场文书
财务部绩效考核方案
2014/05/04 职场文书
网络优化专员求职信
2014/05/04 职场文书
体育专业自荐书
2014/05/29 职场文书
计算机毕业大学生求职信
2014/06/26 职场文书
个人批评与自我批评范文
2014/10/17 职场文书
家长会欢迎词
2015/01/23 职场文书
django如何自定义manage.py管理命令
2021/04/27 Python
Html5通过数据流方式播放视频的实现
2021/04/27 HTML / CSS