python类的__slots__属性

常规情况下,类的属性字典是共享的,而实例的字典是独立的。如果一个类的属性较少,但是拥有很多的实例,这些实例的属性字典会占用较多的内存空间。对这样的类来说,为了节省内存空间,可以使用__slots__类变量代替__init__()来存储数据属性。

定义__slots__之后,系统会为实例使用一种更加紧凑的内部表示,即通过一个很小的固定大小的数组来构建,而不是为每一个实例定义一个字典。

__slots__可以是列表、元组、字符串等可迭代对象

定义__slots__之后,类保留有__dict__,但实例没有,取代的是__slots__,且实例不能增加__slots__定义之外的属性。

class animal:
    __slots__ = ('name','age')
    def eat(self):
        print('%s is eating'%self.name)

cat=animal()
print(animal.__dict__)#实例还是有__dict__的
# print(cat.__dict__)会报错,实例已经没有__dict__字典了
print(cat.__slots__)  #('name', 'age'),只返回数据属性名称,不返回对应的值
cat.eat()
#cat.sex='male'会报错,不能为实例增加除了__slots__定义之外的属性了

猜你喜欢

转载自www.cnblogs.com/Forever77/p/10100066.html