datacalasses的Python3默认值不能与属性一起使用

datacalasses的Python3默认值不能与属性一起使用,python,python-3.7,Python,Python 3.7,为什么属性对我不起作用,当我没有指定procent时,它会抛出一个异常(可能是bug吗?)?或者是我在数据类中缺少的东西 from dataclasses import dataclass, field @dataclass class A(object): index: int #procent: float = 1.0 procent: float = field(default=1.0) def __post_init__(self): s

为什么属性对我不起作用,当我没有指定procent时,它会抛出一个异常(可能是bug吗?)?或者是我在数据类中缺少的东西

from dataclasses import dataclass, field

@dataclass
class A(object):
    index: int
    #procent: float = 1.0
    procent: float = field(default=1.0)
    def __post_init__(self):
        self.row, self.col = divmod(self.index, 13)  # Row, Column

@dataclass
class B(object):
    index: int
    #procent: float = 1.0
    procent: float = field(default=1.0)
    def __post_init__(self):
        self.row, self.col = divmod(self.index, 13)  # Row, Column
    @property
    def procent(self):
        return self._procent
    @procent.setter
    def procent(self, x: float, base: float = 5):
        self._procent = float(base * round(x * 100 / base) / 100)


print(A(index=1, procent=0.33))
# A(index=1, procent=0.33)
print(A(1))
# A(index=1, procent=1.0)

print(B(1, 0.33))
# B(index=1, procent=1.35)

B(1) # Explodes here

#    self._procent = float(base * round(x * 100 / base) / 100)
#TypeError: unsupported operand type(s) for *: 'property' and 'int'

由于将值存储在
self.\u-procent
中,因此还应将字段命名为
\u-procent

_procent: float = field(default=1.0)
在完整示例的上下文中:

from dataclasses import dataclass, field

@dataclass
class B(object):
    index: int
    _procent: float = field(default=1.0)

    def __post_init__(self):
        self.row, self.col = divmod(self.index, 13)  # Row, Column

    @property
    def procent(self):
        return self._procent

    @procent.setter
    def procent(self, x: float, base: float = 5):
        self._procent = float(base * round(x * 100 / base) / 100)

print(B(1))
输出

B(index=1, _procent=1.0)