类和元类,以便更容易地处理“插槽”。
autoslot的Python项目详细描述
自动批次
自动“插槽”。
演示
fromautoslotimportSlotsclassCompact(Slots):def__init__(self,a,b):self.x=aself.y=b
这将产生完全的类,就像您已经完成了一样:
classCompact:__slots__={'x','y'}def__init__(self,a,b):self.x=aself.y=b
简单:扫描__init__()中的代码以查找所有分配 添加到self上的属性,这些属性被添加为__slots__。
使用autoslot.Slots而不是手动插槽声明的好处是 你可以修改 在__init__()方法中添加更多属性的代码,以及 更改将自动反映在__slots__定义中。
你也可以拥有两个世界中最好的:你期望的领域的插槽, 以及a__dict__对于那些您没有:
fromautoslotimportSlotsPlusDictclassSemiCompact(SlotsPlusDict):def__init__(self,a,b):self.x=aself.y=binst=SemiCompact(1,2)inst.z=123# <-- This won't fail!
属性x和y将存储在插槽中,而所有其他属性 动态分配的属性将进入通常的__dict__实例 在教室里。如果类的大多数属性出现在__init__() 方法(这些将成为插槽),然后字典导致的空间膨胀 哈希表扩展将只包含动态分配的 属性。
它是如何工作的?
你自己看看!代码很小。
换句话说:元类找到__init__()方法(如果存在),并且 访问其字节码。它查找对属性的所有赋值 self,并将这些视为所需的__slots__项。然后 元类将__slots__注入类定义的命名空间 然后允许类创建正常进行。