Python __slots__ 的用法笔记

Python 是一个动态语言,可以动态的给实例或类增减属性或方法,给类添加的属性会影响到前后所有创建的实例。但是使用 __slots__ 属性可以限定类或实例属性和方法,如果没有 __slots__ 的话实例的属性和方法包含在实例的 __dict__ 字典中,类的属性和方法包含在类的 __dict__ 字典中。

在使用 __slots__ 按常规写法可能会出现的问题大概有

  1. AttributeError: 'Xxx' object has no attribute 'yyy'
  2. AttributeError: 'Xxx' object attribute 'yyy' is read-only
  3. ValueError: 'yyy' in __slots__ conflicts with class variable

我们来看下面的例子

类或实例可以随意的添加属性和方法

如果我们引入 __slots__ 来限定属性或方法

引入了 __slots__ 后实例不再有 __dict__ 属性,只能添加在 __slots__ 中列出的属性或方法。添加没在 __slots__ 中的属性或方法时会报错误

AttributeError: 'Xxx' object has no attribute 'yyy'

在初始化函数中 __init__(self) 中也是一样的,如

__slots__ 中没有 ears, 所以不能在初始化方法或外部动态添加该属性

但是定义类时声明的方法不在 __slots__ 约束内

__slots__ 也不约束通过类动态添加属性或方法

__slots__ 中不能包含类变量,比如

声明的没定义在 __slots__ 中的类变量对实例方法是只读的

但是声明在没定义在 __slots__ 中的类变量通过实例来修改也不行,但可以通过类属性来修改

定义在 __slots__ 中的属性或方法在 IDE 中会有智能提示。

__slots__ 只能作用在当前类中,不会影响到子类,子类需定义自己的 __slots__.

__slots__ 对于实例是只读的,通过类的 __slots__ 属性可修改,但不改变原有的约束

__slots__ 还可声明为 list, 或省略圆括号的 tuple 形式

另外,用 __slots__ 避免了使用 __dict__ 记录实例属性和方法,可节约一些内存

本文链接 https://yanbin.blog/python-__slots__-notes/, 来自 隔叶黄莺 Yanbin Blog

[版权声明] Creative Commons License 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。

Subscribe
Notify of
guest

1 Comment
Inline Feedbacks
View all comments
bbbush
1 year ago

lazy cat.