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__魔法的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程