开放类:在运行期间,可动态向实例或类添加新成员,方法
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__等成员,所以对于需要大量实例化的类来讲,就节约了大量的内存