我不明白错误消息,也找不到其他问题和答案来帮助我理解这一点。 MWE 使用 Python 3.9.2 进行测试。我知道有一个slots=True
Python 3.10 数据类中的参数。但这不是这里的选择。
错误输出:
Traceback (most recent call last):
File "/home/user/dc.py", line 6, in <module>
class Foo:
ValueError: 'b' in __slots__ conflicts with class variable
为什么会发生这种情况?我什至不明白该错误的背景。
#!/usr/bin/env pyhton3
from dataclasses import dataclass, field
@dataclass(init=False)
class Foo:
__slots__ = ('a', 'b')
a: int
b: list[str] = field(init=False)
def __init__(self, a, ccc):
self.a = a
# b = _some_fancy_modifications(ccc)
self.b = b
if __name__ == '__main__':
f = Foo(1, list('bar'))
会员b
没有作为参数给出__init__()
但根据参数计算ccc
。因此我认为我需要自己写一个__init__()
(@dataclass(init=False)
)和b
成员不应由数据类初始化(field(init=False)
)。也许我在这里误解了什么?
For __slots__
为了工作,Python 必须插入特殊的描述符 https://docs.python.org/3/reference/datamodel.html#implementing-descriptors对象放入类字典中以管理属性访问。否则,由于属性不存储在实例字典中,属性查找将完全无法找到您的属性。描述符告诉属性查找机制如何查找特殊属性。
For the b
要工作,Python 必须为该属性插入一个描述符,该描述符对应于'b'
输入你的班级字典。但你已经在那里放了一些东西:field
您创建的对象。你不能有一个field
object and槽描述符作为同一键的值。 Python 认识到这是一个问题,并引发错误来告诉您需要对此采取措施。
这确实不是您可以解决的问题。__slots__
对数据类的支持需要对数据类机制进行更改,这些更改发生在 3.10 中。在 3.9 中,您无法使用带有数据类的槽。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)