Python面向对象编程进阶2之__slots__魔法
2021/7/13 22:09:11
本文主要是介绍Python面向对象编程进阶2之__slots__魔法,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
开始Python的复习!(以前学的忘了好多-_-)
主要参考的是Github上的一个项目:https://github.com/jackfrued/Python-100-Days
文章主要是对该项目中的内容进行学习 穿插一点自己的学习想法等内容~
作为一门动态语言,可以添加属性 方法,自然也应该有删除属性 方法功能。如果我们需要限定自定义类型的对象只能绑定某些属性,可以通过在类中定义__slots__变量来进行限定。该类限定只对当前类的对象生效,对子类不起任何作用。
__slots__魔法
class Person(object): # 限定Person对象只能绑定_name, _age和_gender属性 __slots__ = ('_name', '_age', '_gender') def __init__(self, name, age): self._name = name self._age = age
__slots__出现的原因来啦~
Python是动态语言,对于普通的类,可以为类实例赋值任何属性,这些属性会存储在__dict__中,但数据通过字典(Hash)存储所占用的空间较大,效率较低,__slots__属性的出现就是为了解决上述问题。
__slots__属性的作用是声明并限定类成员,并拒绝类创建__dict__和__weakref__属性以节约内存空间。
字面来看是为了限制随意添加属性,造成混乱。但实际上如果了解过Python底层的实现原理,你会发现在Python当中为每一个实例都创建了一个字典,就是大名鼎鼎的__dict__字典。正是因为背后有一个字典,所以我们才可以创造出原本不存在的成员,也才支持这样动态的效果。
我们可以人工地调用这个字典输出其中的内容,我们在加上__slots__关键字之前,输出的结果是这样的:{'a': None, 'b': None}
但是加上了这个关键字之后,会得到一个报错,会告诉你Exp这个对象当中没有__dict__这个成员。原因很简单,因为使用dict来维护实例,会消耗大量的内存,额外存储了许多数据,而使用__slots__之后,Python内部将不再为实例创建一个字典来维护,而是会使用一个固定大小的数组,这样就节省了大量的空间。这个节省可不是一点半点,一般可以节省一半以上。也就是说牺牲了一定的灵活性,保证了性能。这一点也是__slots__这个关键字设计的初衷,但是现在很多人都用错了地方。【实际上之前还看到一篇帖子有人做了实验,在百万数据量以下 这个方法没有显著优势】
参考链接
https://zhuanlan.zhihu.com/p/134128022
这篇关于Python面向对象编程进阶2之__slots__魔法的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-24Python编程基础详解
- 2024-11-21Python编程基础教程
- 2024-11-20Python编程基础与实践
- 2024-11-20Python编程基础与高级应用
- 2024-11-19Python 基础编程教程
- 2024-11-19Python基础入门教程
- 2024-11-17在FastAPI项目中添加一个生产级别的数据库——本地环境搭建指南
- 2024-11-16`PyMuPDF4LLM`:提取PDF数据的神器
- 2024-11-16四种数据科学Web界面框架快速对比:Rio、Reflex、Streamlit和Plotly Dash
- 2024-11-14获取参数学习:Python编程入门教程