一起使用 python 数据类和 属性 真的有错误吗?

Is there really a bug in using python dataclass and property together?

我来过这里:

并且无法找到为什么这个简单的代码可以正常工作的直接答案...

class Vehicle:
    
    def __init__(self, wheels: int = 10):
        self.wheels = wheels # -> calls the setter method
    
    @property
    def wheels(self) -> int:
        print("getting wheels")
        return self._wheels
    
    @wheels.setter
    def wheels(self, wheels: int):
        print("setting wheels to", wheels)
        self._wheels = wheels

v = Vehicle() 
number = v.wheels # -> calls the getter method
print(number)

# last output: 10

...但是这个没有(使用 dataclass):

from dataclasses import dataclass

@dataclass
class Vehicle:
    
    wheels: int = 10
    
    @property
    def wheels(self) -> int:
        print("getting wheels")
        return self._wheels
    
    @wheels.setter
    def wheels(self, wheels: int):
        print("setting wheels to", wheels)
        self._wheels = wheels

v = Vehicle() 
number = v.wheels
print(number)

# output: <property object at 0x000002042D70DDB0>

即使 dataclassofficial documentation 一开始就明确告诉装饰器 @dataclass 从第一段代码中添加了 __init__ 方法,即这段代码:

@dataclass
class Vehicle:
    wheels: int = 10

应该添加这个 __init__:

def __init__(self, wheels: int = 10):
    self.wheels = wheels

这真的是一个错误吗?


简短说明:

私有属性 _wheels 只能在 property 的方法内部访问,这是应该的(以隔离它)。

我在其他线程(上面列出的)中发现该属性是在方法之外操作的,公开为 'public',这在某些情况下是不需要的。

那是你代码中的错误。

此代码:

wheels: int = 10

wheels 设置为 10,然后紧接此代码:

@property
def wheels(self) -> int:
    print("getting wheels")
    return self._wheels

wheels 设置为 property 实例。

@dataclass 看不到 10。你的 10 不见了。注释仍然存在,因此 @dataclass 创建一个 wheels 字段,但您的字段的默认值是 property 实例,而不是 10.