简述:当一个类需要创建大量实例时,通过_slots_可以声明实例所需要的属性
具体用法:如class std(object) : _slots_=['foo'] ,声明该类存在一个属性为foo,这样做的好处是能够加快属性的访问速度和减少内存消耗,_slots_本质上是一个类变量,变量的值可以是元组、列表、任何可迭代对象,当然也可以是一个字符串,但那就意味着该类只有一个成员变量,一旦在类中使用了_slots_,那么该类所创建的对象将会失去__dict__ , 即失去名称空间,失去名称空间就代表着不能添加除了_slots_以外的新属性了。
slots 定义的元素,必须是字符串类型,否则运行阶段就会报错
使用了slots的类的对象会失去名称空间,相当于继承类的对象也是无法增加新的成员变量的
常见误区:
关于__slots__的一个常见误区是它可以作为一个封装工具来防止用户给实例增加新的属性。
尽管使用__slots__可以达到这样的目的,但是这个并不是它的初衷。
更多的是用来作为一个内存优化工具。
代码实例:
class prin(object):#普通类
def ssd(self):
print(self)
class svc(object):#使用了slot的基类
__slots__ = ["name"]
class svc2(svc):
pass
s2=svc();
#print(s2.__dict__) #没有类对象__dict__,直接报错
print(s2.__slots__)#可以看到定义的属性,此处只有name
s2.name=18;#修改属性的值
#s2.x=0; #不能新增属性
s3=svc2();
print(s3.__dict__)#继承的类的dict存在且为空