浅谈python之新式类
作者:Dear、 发布时间:2022-05-12 08:34:48
前言
本文中代码运行的python版本一律采取2.7.13
科普:
经典类:classic class
新式类:new-style class
python2.2 之前并没有新式类
python2.2-2.7 新式类与经典类并存, 默认使用经典类, 除非显式继承object
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>
来源:https://www.cnblogs.com/dears/p/9138264.html
猜你喜欢
- 初步认识k-means翻译过来就是K均值聚类算法,其目的是将样本分割为k个簇,而这个k则是KMeans中最重要的参数:n_clusters,
- 1. 获取系统当前时间MySQL 版本为 5.7,详细的时间函数可以参考 MySQL 官方文档 在这里1.1. 获取 YYYY-MM-DD
- 使用python将图片改为灰度图或黑白图有三种方式,分别是是使用cv2库和PIL库来实现,详细过程如下所示。1. 使用cv2库将图片改为灰度
- 前面的python3入门系列基本上也对python入了门,从这章起就开始介绍下python的爬虫教程,拿出来给大家分享;爬虫说的简单,就是去
- [mail function] ; For Win32 only. SMTP = mail3.focuschina.com smtp_por
- 泛型,如果你学过Java ,应该对它不陌生吧。但你可能不知道在 Python 中(3.4+ ),也可以实现简单的泛型函数。在Python中只
- 详解Python list 与 NumPy.ndarry 切片之间的区别实例代码:# list 切片返回的是不原数据,对新数据的修改不会影响
- 本博客将为各位分享Python Helium库,其是在 Selenium库基础上封装的更加高级的 Web 自动化工具,它能够通过网页端可见的
- 我们越来越多的使用pandas进行数据处理,有时需要向一个已经存在的csv文件写入数据,传统的方法之前我也有些过,向txt,excel文件写
- 本文实例讲述了Zend Framework教程之资源(Resources)用法。分享给大家供大家参考,具体如下:Zend_Applicati
- 本文实例讲述了Python求两个文本文件以行为单位的交集、并集与差集的方法。分享给大家供大家参考。具体实现方法如下:s1 = set(ope
- 集合 (set)1、由不同的元素组成,用{ }大括号括起来,用,逗号隔开2、无序的3、集合中的元素必须是比可变类型4、集合会自动去重例如:s
- 大家都知道,在通过Pyqt4的designer工具创建界面.ui文件后需要手动cmd命令将.ui文件转换为.py之后才能进行事件的编写,如果
- 使用python删除excel表格重复行。# 导入pandas包并重命名为pdimport pandas as pd# 读取Excel中Sh
- 我们给大家详细分析了一下在JS调试的时候经常用到的断点调试,并把经验和技巧做了总结,以下是全部内容:1.断点调试是啥?难不难?断点调试其实并
- 本文实例讲述了Python解析json的方法。分享给大家供大家参考,具体如下:刚学习到Python中解析json的方法,觉得有必要在这里坐下
- 这篇文章主要介绍了基于python traceback实现异常的获取与处理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参
- 前言shape函数是Numpy中的函数,它的功能是读取矩阵的长度,比如shape[0]就是读取矩阵第一维度的长度。直接用.shape可以快速
- 在需要使用到大批量数据的时候,即可以使用随机数据进行生成操作Faker的介绍Faker是python方向的一个第三方库,主要用来创造伪数据,
- 引言通过一张照片居然发现女友在宿舍里没去上课!强大的照片位置信息获取,快来一起学习吧!一、exifread函数库要怎样获得拍摄图片的GPS呢