我在尝试将数据类与属性一起使用时遇到了一个奇怪的问题。
我把它降到最低限度来重现它:
import dataclasses
@dataclasses.dataclass
class FileObject:
_uploaded_by: str = dataclasses.field(default=None, init=False)
uploaded_by: str = None
def save(self):
print(self.uploaded_by)
@property
def uploaded_by(self):
return self._uploaded_by
@uploaded_by.setter
def uploaded_by(self, uploaded_by):
print('Setter Called with Value ', uploaded_by)
self._uploaded_by = uploaded_by
p = FileObject()
p.save()
Run Code Online (Sandbox Code Playgroud)
这输出:
Setter Called with Value <property object at 0x7faeb00150b0>
<property object at 0x7faeb00150b0>
Run Code Online (Sandbox Code Playgroud)
我希望得到 None 而不是
我在这里做错了什么还是偶然发现了一个错误?
在阅读@juanpa.arrivillaga 的回答后,我认为使 upload_by 和 InitVar 可能会解决问题,但它仍然返回一个属性对象。我想是因为这个,他说:
datalcas 机制将对类主体中的类型注释变量的任何赋值解释为 created 的默认值
__init__。
我能找到的适用于默认值的唯一选项是从数据类定义中删除 uploadby 并编写一个实际的__init__. 这有一个不幸的副作用,即要求您__init__手动为数据类编写一个,这否定了使用数据类的一些价值。这是我所做的:
import dataclasses …Run Code Online (Sandbox Code Playgroud)