我目前正在使用type()实现时隙元类
type(i, (), {'__slots__': tuple(data)当然,理想情况下,我会保留插槽,因为我有一个usecase,它将受益于它们更小的内存占用和更快的访问速度。
当我这么做时:
dir(slotted_class)
>>>['__class__',
'__delattr__',
'__dir__',
'__doc__',
'__eq__',
'__format__',
'__ge__',
'__getattribute__',
'__gt__',
'__hash__',
'__init__',
'__init_subclass__',
'__le__',
'__lt__',
'__module__',
'__ne__',
'__new__',
'__reduce__',
'__reduce_ex__',
'__repr__',
'__setattr__',
'__sizeof__',
'__slots__',
'__str__',
'__subclasshook__',
'slotted_attribute1',
'slotted_attribute2',
'slotted_attribute3',
'slotted_attribute4']然而,当我跑步时:
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发布于 2017-06-12 10:52:50
这可能只是data变量上的一些错误。确保它是一个可迭代的字符串序列。
在我的交互环境中尝试这样做是完美的:
In [162]: m = type("m", (), {"__slots__": ("test1",)})
In [163]: m.test1
Out[163]: <member 'test1' of 'm' objects>
In [164]: n = m()
In [165]: n.test1 = 10
In [166]: n.test1
Out[166]: 10其他考虑因素如下:
type动态创建类。在阅读问题标题时,大多数人会认为您正在尝试将type本身专门化,并将__slots__包含在其中。__init__方法:因此,您显然无法在创建类时传递名称参数,并使它们在实例上自动设置,就像您在显式类上所做的那样。如果第二个主题是您的问题,我不再继承object (隐含的,但他调用的是空的- () -第二个参数),而是使用一个通用的__init__方法创建一个基类,将这些kwargs设置为属性:
class Base:
__slots__ = ()
def __init__(self, **kwargs):
for key, value in kwargs.items():
setattr(self, key, value)
slotted_class = type("slotted_class", (Base,), {"__slots__": ...})https://stackoverflow.com/questions/44487217
复制相似问题