小编Mic*_*ard的帖子

一起使用数据类和属性时的奇怪问题

我在尝试将数据类与属性一起使用时遇到了一个奇怪的问题。

我把它降到最低限度来重现它:

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)

python properties python-3.x python-dataclasses

5
推荐指数
1
解决办法
346
查看次数