为什么 slot=True 使数据类忽略其默认值?

enk*_*tor 3 python slots python-dataclasses

此代码按预期工作:

from dataclasses import dataclass

@dataclass(slots=False, init=False)
class Test:
    field: str = "default value"


print(Test())  # outputs "Test(field='default value')"
Run Code Online (Sandbox Code Playgroud)

但是,如果我更改slotsTrue,它会抛出 AttributeError:

AttributeError: 'Test' object has no attribute 'field'
Run Code Online (Sandbox Code Playgroud)

要解决此问题,我必须使用生成的__init__方法或显式初始化自定义方法中的所有字段__init__。这种行为背后的原因是什么?

use*_*ica 5

无论如何,您都没有使用默认值初始化对象 - 您__init__根本没有初始化对象。但是,如果没有,它看起来__slots__就像存在默认值,因为实例属性查找回退到类,并发现类上设置为。field"default value"

有了slots=Truefield班级就不再设置了"default value"。它被设置为一个槽描述符,负责从实例内存布局的右侧部分检索槽值。实例属性查找找到槽描述符,它检查实例内存布局中的槽,发现槽是空的,因此它引发一个AttributeError.