Python __slots__ and __dict__

Python的__slots__特性用于减少内存开销,避免动态添加属性时使用__dict__。当定义__slots__,对象不再有__dict__和__weakref__,无法动态赋属性。可通过在__slots__中加入__dict__实现动态赋值,但会导致__slots__失效。类变量在实例中被转换为只读描述器,理解这一机制需要了解Python描述器。__slots__与__dict__的内存比较和使用技巧值得深入研究。
摘要由CSDN通过智能技术生成

Python对象中一般会有一个__dict__属性,负责存储对象的属性,当为对象动态地赋予属性时,也是在__dict__中添加该属性:

In [44]: class PythonObject(object):
    ...:     pass
    ...:

In [45]: o = PythonObject()

In [46]: o.__dict__
Out[46]: {}

In [47]: o.new_attr = 'new attr'

In [48]: o.__dict__
Out[48]: {
  'new_attr': 'new attr'}

__dict__属性是通过Python dict来实现的,原理上即hash table,因此默认会保留多余的空间(hash table装载因子超过2/3的时候需要扩容)。如果一个Python对象不需要动态赋值属性,并且该Python对象所属的类需要很多实例化对象的时候,那么__dict__造成的内存开销就会比较大,此时可以考虑使用__slots__属性来减小内存的开销。

可以在__slots__属性中定义该Python对象需要的属性,此时如果为Python对象动态赋予未在__slots__定义的属性,就会raise AttributeError。

In [49]: class SlotClass(object):
    ...:     __slots__ = ('attr1', 'attr2')
    ...:

In [50]: s = SlotClass()

In [51]: s.attr1 = 'attr1'

In [52]: s.attr1
Out[52]: 'attr1'

In [53]: s.attr3 = 'can not assign'
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-53-901ed201a4ae> in <module>()
----> 1 s.attr3 = 'ca
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值