浅谈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中__call__方法示例分析
Oct 11 Python
Python简单调用MySQL存储过程并获得返回值的方法
Jul 20 Python
Python实现购物程序思路及代码
Jul 24 Python
Django实现登录随机验证码的示例代码
Jun 20 Python
Python实现聊天机器人的示例代码
Jul 09 Python
Python实现的特征提取操作示例
Dec 03 Python
python用fsolve、leastsq对非线性方程组求解
Dec 15 Python
python语言基本语句用法总结
Jun 11 Python
如何安装2019Pycharm最新版本(详细教程)
Sep 26 Python
利用Python产生加密表和解密表的实现方法
Oct 15 Python
Python如何将图像音视频等资源文件隐藏在代码中(小技巧)
Feb 16 Python
详解Flask前后端分离项目案例
Jul 24 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
对Session和Cookie的区分与解释
2007/03/16 PHP
解决phpmyadmin中缺少mysqli扩展问题的方法
2013/05/06 PHP
PHP基于redis计数器类定义与用法示例
2018/02/08 PHP
详解阿里云视频直播PHP-SDK接入教程
2020/07/09 PHP
Javascript将string类型转换int类型
2010/12/09 Javascript
JQuery将文本转化成JSON对象需要注意的问题
2011/05/09 Javascript
js 代码优化点滴记录
2012/02/19 Javascript
浅谈关于JavaScript的语言特性分析
2013/04/11 Javascript
js中一个函数获取另一个函数返回值问题探讨
2013/11/21 Javascript
js 数值转换为3位逗号分隔的示例代码
2014/02/19 Javascript
Internet Explorer 11 浏览器介绍:别叫我IE
2014/09/28 Javascript
理解javascript中的严格模式
2016/02/01 Javascript
JS+CSS实现闪烁字体效果代码
2016/04/05 Javascript
jQuery Ajax 上传文件处理方式介绍(推荐)
2016/06/30 Javascript
Angular 1.x个人使用的经验小结
2017/07/19 Javascript
微信小程序 获取session_key和openid的实例
2017/08/17 Javascript
express默认日志组件morgan的方法
2018/04/05 Javascript
详解mpvue实现对苹果X安全区域的适配
2019/07/31 Javascript
axios异步提交表单数据的几种方法
2019/08/11 Javascript
antd Form组件方法getFieldsValue获取自定义组件的值操作
2020/10/29 Javascript
[02:08]我的刀塔不可能这么可爱 胡晓桃_1
2014/06/20 DOTA
python计算N天之后日期的方法
2015/03/31 Python
python获得文件创建时间和修改时间的方法
2015/06/30 Python
《Python学习手册》学习总结
2018/01/17 Python
python测试mysql写入性能完整实例
2018/01/18 Python
Python3实现将一维数组按标准长度分隔为二维数组
2019/11/29 Python
CSS3弹性盒模型开发笔记(一)
2016/04/26 HTML / CSS
我的网上商城创业计划书
2013/12/26 职场文书
销售人员自我评价
2014/02/01 职场文书
称象教学反思
2014/02/03 职场文书
员工工作表现评语
2014/04/26 职场文书
开学典礼观后感
2015/06/15 职场文书
关于实现中国梦的心得体会
2016/01/05 职场文书
2016银行求职自荐信
2016/01/28 职场文书
Jupyter notebook 更改文件打开的默认路径操作
2021/05/21 Python
Spring Security动态权限的实现方法详解
2022/06/16 Java/Android