性能优化:__dict__和__slots__

__dict__

  • 类调用__dict__属性,返回类属性和方法的字字典
  • 实例调用__dict__属性,返回实例相关的属性和方法

1. __dict__ 有什么用?基本定义是啥?

  • python 中__dict__存储了该对象的一些属性
  • 类和实例分别拥有自己的__dict__
  • 在__init__中声明的变量,会存到实例的__dict__中

2.举个例子

类的静态函数、类函数、普通函数、全局变量以及一些内置的属性都是放在类__dict__里的

 3.Python里哪些没有__dict__属性

虽然说一切皆对象,但对象也有不同,就好比不是每个人的女朋友都是一个人一样,一些内置的数据类型是没有__dict__属性的

int, list, dict等这些常用的数据类型是没有__dict__属性的,其实这是可预料的,就算给了它们dict属性也没啥用,毕竟它们只是用来做数据容器的。

4.有继承关系的时候,来看看各自的__dict__

__slots__

  • 默认情况下,类的实例有一个字典用于存储属性,这对于具有很少实例变量的对象会很浪费时间。当创建大量实例时,空间消耗可能变得尖锐。
  • 可以通过在类中定义__slots__声明接收一个实例变量序列,并在每个实例中只保留足够保存每个变量值的空间。因为没有为每个实例创建__dict__,所以节省空间
class Base:
    # 指定类对象所能绑定的属性,限制类属性,Base类只能绑定name属性,其他属性绑定不上
    # 节约内存:定义了slot属性之后,那么该对象不会再自动生成__dict__属性
    __slots__ = ['name']

    def __init__(self, name):
        self.name = name

b = Base('aa')
# b.age = 10  'Base' object has no attribute 'age'

# 'Base' object has no attribute '__dict__'
print(b.__slots__)
原文地址:https://www.cnblogs.com/ella-li/p/14223443.html