python-开放类优化内存性能

开放类:在运行期间,可动态向实例或类添加新成员,方法

1.实例不能添加方法到类,反之可以

class A: pass

a = A()

a.func = lambda x: x+1

a.func  # <function <lambda>>

A.func  # AttributeError: type object 'A' has no attribute 'func'

2.object类,不能添加任何成员,也没有普通类的__dict__方法

2.1SimpleNamespace简单继承object,其作用用来代替 class X: pass 语句

import types
o = types.SimpleNamespace(a=1,b=2)
print(o.__dict__)
o.c=3
print(o.__dict__)

>>>
{'a': 1, 'b': 2}
{'a': 1, 'b': 2, 'c': 3}

3. __slots__类属性,用来处理 内存和性能 问题

对于需要创建海量实例的类来说,可以通过设置__slots__,阻止实例(类依然可以添加方法)创建__dict__等成员。解释器只为__slots__指定的成员分配空间。

class A:
    __slots__ = ['x','y']  # only two members
>>> >>> a
= A() >>> a.x = lambda x:x+1 >>> a.y = 2 >>> print(a.x(3)) >>> print(A.__dict__) # 实例a 没有__dict__属性了
# 结果
4
{'__module__': '__main__', '__slots__': ['x', 'y'], 'x': <member 'x' of 'A' objects>, 'y': <member 'y' of 'A' objects>, '__doc__': None}

>>> a.z=3
# AttributeError: 'A' object has no attribute 'z'

继承拥有__slots__属性的类,依然需要指定__slots__为空,或新增某些属性

--------------------------------------------------------------------------------------------

因为__slots__阻止了实例创建__dict__等成员,所以对于需要大量实例化的类来讲,就节约了大量的内存

原文地址:https://www.cnblogs.com/tangpg/p/9578995.html