一起使用 python 数据类和 属性 真的有错误吗?
Is there really a bug in using python dataclass and property together?
我来过这里:
- Required positional arguments with dataclass properties
- Combining @dataclass and @property
- Reconciling Dataclasses And Properties In Python
并且无法找到为什么这个简单的代码可以正常工作的直接答案...
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>
即使 dataclass
的 official 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
.
我来过这里:
- Required positional arguments with dataclass properties
- Combining @dataclass and @property
- Reconciling Dataclasses And Properties In Python
并且无法找到为什么这个简单的代码可以正常工作的直接答案...
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>
即使 dataclass
的 official 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
.