Python3 的__slots__

slots的作用:

1,使用 slots 类属性限制实例属性的添加。只允许实例属性具有__slots__指定的属性,在试图为实例添加其它属性时将报错。注: slots 类属性可以是列表,可以是元组。

class Person:
    __slots__ = ["name","id"]
    pass

p=Person()
p.name="Jordan"
p.id=1

p.gender="男"  

result:

Traceback (most recent call last):
  File "C:/Users/PycharmProjects/pythonNet/test.py", line 9, in <module>
    p.gender="男"
AttributeError: 'Person' object has no attribute 'gender'

2,使用 slots 类属性节省空间
默认情况下, python在各个实例中, 用 dict 的字典存储实例属性. 因此实例的属性是动态变化的, 可以在运行期间任意添加属性. 而字典是消耗内存比较大的结构. 因此当对象的属性名称确定时, 使用 slots 可以节约内存.

class Vector2d:
slots = (’__x’, 'y’)
typecode = ‘d’
# 下面是各个方法(因排版需要而省略了)
在类中定义 slots 属性的目的是告诉解释器:“这个类中的所有实例属性都在这儿
了!” 这样, Python 会在各个实例中使用类似元组的结构存储实例变量, 从而避免使用消
耗内存的 dict 属性. 如果有数百万个实例同时活动, 这样做能节省大量内存.
即存在__slots
属性就不会创建 dict 属性了。
参考:《流畅的python》阅读笔记

使用slots需要注意的地方:

使用__slots__要注意:
1,__slots__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的:

>>> class GraduateStudent(Student):
...     pass
...
>>> g = GraduateStudent()
>>> g.score = 9999

2,除非在子类中也定义__slots__,这样,子类实例允许定义的属性就是自身的__slots__加上父类的__slots__。

你可能感兴趣的:(python3)