Python进阶话题杂谈(四)__slots__
2018-06-15 本文已影响0人
樱雨楼
__slots__是Python类中的一个非常重要的优化手段。使用了__slots__的类,其在内存占用、实例化以及属性访问等方面,性能都将大幅提升。
Python的类具有动态属性注册的性质,而之所以能够这样做的原因在于:Python对于每一个对象,均使用哈希表维护了一个属性键值对(即__dict__类变量),从而允许键值对的动态增删与快速访问。但在有些情况下,某个类的属性是不需要进行动态注册的,这种情况往往出现在一些数量多且属性、功能较少的类,或是一些功能高度固定的类中。此时就可以通过__slots__对代码进行优化。
__slots__是一个类变量,其一旦被定义,那么__dict__类变量就将被弃用,程序将不再使用哈希表维护属性,而是采用一种类似于frozenset的数据结构来维护。这样做以后,该类的实例将只能访问、修改__slots__所给出的各个属性,而不能够添加、访问除此以外的其他属性。但这样做的好处在于,这样的类实例的内存占用将大幅降低,且实例化、属性访问等过程的速度均将大幅提升。
__slots__属性通过一个tuple指定:
class Test:
__slots__ = ('a', 'b')
test = Test()
test.a = 1
test.c = 2
则上例中,Test类的实例将只能访问、修改属性a和b,对其他属性的访问(如上例中的c),都将导致一个异常。
2018年6月于苏州