__slots__ 用法
slots:是一个类变量,变量值可以是列表,元祖,或者可迭代对象,也可以是一个字符串(意味着所有实例只有一个数据属性)
使用了__slots__之后,实例化的对象,就没有__dict__,即没有自己的名称空间
这就说明,对象将无法添加__slots__定义以外的新属性。
slots 定义的元素,必须是字符串类型,否则运行阶段就会报错
定义了__slots__的类,就失去了继承的功能,如果强制进行继承,__slots__就没有意义了。
常见误区:
关于__slots__的一个常见误区是它可以作为一个封装工具来防止用户给实例增加新的属性。
尽管使用__slots__可以达到这样的目的,但是这个并不是它的初衷。
更多的是用来作为一个内存优化工具。
代码示例
# class Bar:
# def say(self):
# print(self)
class Foo:
__slots__ = ["name"]
# class Goo(Foo):
# pass
f=Foo()
# print(f.__dict__) 调用就会报错,会现实f没有__dict__属性
print(f.__slots__)#可以看到里面的定义的属性
f.name = 1
print(f.name) #如果没有值,就没法调用,会报错
# f.x=1 #没法添加新的属性
# print(f.x)
# print(f.__slots__)
# print(f.__dict__) #如何Foo类继承Bar,那么__slots__就不在起作用,最好不要继承
# g=Goo()
# g.age =1
# print(g.age)
# print(g.__dict__)
# g.name = 1
# print(g.__slots__)
执行结果
['name']
1