python的__slots__
__slots__用于限制允许实例动态绑定的属性,__slots__中没有定义的属性实例无法动态绑定(这是__slots__的表面意义)
__slots__只能限制实例绑定属性,无法限制类绑定属性
__slots__只能限制定义了此__slots__的类实例化出来的实例,无法限制继承了此类的子类实例化出来的实例
如果子类也定义了__slots__,那么实际生效的范围是父类与子类__slots__的集合
有如下的坑点和额外作用:
在不使用__slots__时,类属性与实例属性的关系如下:在不定义实例属性时,实例属性跟着类属性走;重新定义了实例属性后会发生覆盖,覆盖之后实例属性与类属性就没有了关系。即使修改类属性也不再影响实例属性
在类定义了__slots__的情况下,一旦类再绑定了__slots__中规定的属性,那么所有实例的该属性都会跟着类属性走,而且实例的此属性再也无法做原地修改之外的修改(与数据类型可变不可变有关),只有类才能做原地修改之外的修改。
相当于在内存中,类属性和所有实例的属性都指向了一块内存,这样一来与不使用__slots__相比,在某些场景下就可以更好地分配并节省内存,这也是__slots__存在的深层意义。
跟随金角大王的日子