我目前正在使用type()
实现时隙元类:
type(i, (), {'__slots__': tuple(data)
当然,我会在理想情况下继续使用插槽,因为我有一个用例,可以从它们更小的内存占用和更高的访问速度中获益。在
当我这样做的时候:
^{pr2}$但是当我跑步时:
slottedclass.slotted_attribute1
我得到以下错误:
>>> AttributeError Traceback (most recent call last)
<ipython-input-58-88291109fa74> in <module>()
----> 1 slotted_class.slotted_attribute1
AttributeError: slotted_attribute1
编辑:欲了解更多信息和更多困惑: 如果我在不使用元类的情况下直接实现等效的:
class slottedclass_non_meta(object):
__slots__ = ['slotted_attribute1', 'slotted_attribute2', 'slotted_attribute3', 'slotted_attribute4']
def __init__(self, slotted_attribute1, slotted_attribute2, slotted_attribute3, slotted_attribute4):
self.slotted_attribute1, self.slotted_attribute2, self.slotted_attribute3, self.slotted_attribute4 = slotted_attribute1, slotted_attribute2, slotted_attribute3, slotted_attribute4
然后做这个比较 dir(slottedclass)==dir(slottedclass_non_meta)
>>> True
这可能只是您的
data
变量的一些错误。制造 当然,它是一个iterable或字符串序列。在在我的交互环境中尝试这一点,效果完美:
其他注意事项:
type
动态创建类。在阅读问题标题时,大多数人会认为你是在试图专门化type
本身,并将__slots__
包含在其中。在__init__
方法:因此显然无法在类创建时传递name参数并在实例上自动设置,就像在显式类上那样。在如果第二个主题是您的问题,我建议您不要继承
^{pr2}$object
(隐含但要调用的空-()-第二个参数),而是创建一个带有泛型__init__
方法的基类,以将kwargs设置为属性:相关问题 更多 >
编程相关推荐