Python __slots__ 元类问题

2024-10-03 23:26:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在使用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

Tags: selftypedir情况metaclassattributeerrornon
1条回答
网友
1楼 · 发布于 2024-10-03 23:26:45

这可能只是您的data变量的一些错误。制造 当然,它是一个iterable或字符串序列。在

在我的交互环境中尝试这一点,效果完美:

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__方法:因此显然无法在类创建时传递name参数并在实例上自动设置,就像在显式类上那样。在

如果第二个主题是您的问题,我建议您不要继承object(隐含但要调用的空-()-第二个参数),而是创建一个带有泛型__init__方法的基类,以将kwargs设置为属性:

^{pr2}$

相关问题 更多 >