python - Python dataclasses.dataclass 引用变量而不是实例变量
问题描述
c1 和 c2 的构造函数中的默认值应该为 b 和 b 生成新的实例变量。相反,看起来 c1.a 和 c2.a 引用了同一个变量。@dataclass 是否创建了一个类变量?这似乎与预期的功能不一致,我在文档中找不到任何关于类变量的信息。所以,我认为这是一个错误。有人可以向我解释如何解决吗?我应该将其报告为 python 跟踪器上的错误吗?
我知道这个问题必须与python通过引用传递对象和按值传递内置类型的方式有关,因为 b 属性(只是一个浮点数)显示了预期/期望的行为,而 a 属性(这是用户定义的object) 只是一个参考。
谢谢!
从数据类导入数据类
"""输入"""
@dataclass
class VS:
v: float # value
s: float # scale factor
def scaled_value(self):
return self.v*self.s
@dataclass
class Container:
a: VS = VS(1, 1)
b: float = 1
c1 = Container()
c2 = Container()
print(c1)
print(c2)
c1.a.v = -999
c1.b = -999
print(c1)
print(c2)
"""输出"""
Container(a=VS(v=1, s=1), b=1)
Container(a=VS(v=1, s=1), b=1)
Container(a=VS(v=-999, s=1), b=-999)
Container(a=VS(v=-999, s=1), b=1)
解决方案
在 OP 的原始示例中,定义类时会创建一个VS
对象。然后该对象在该类Container
的所有实例之间共享。Container
这是一个问题,因为诸如用户定义的类会VS
导致可变对象。因此,a
任何Container
对象的变化都会改变a
所有其他Container
对象
每次Container
在初始化时实例化一个类时,您都希望生成一个新的 VS 对象。为此,使用函数default_factory
的field
是一个很好的方法。传递一个 lambda 函数允许所有这些都内联完成。
我c
在另一个类的容器中添加了一个成员变量,VS
以说明以这种方式完成时成员是独立的。
from dataclasses import dataclass, field
@dataclass
class VS:
v: float # value
s: float # scale factor
def scaled_value(self):
return self.v*self.s
# Use a zero-argument lambda function for default factor function.
@dataclass
class Container:
a: VS = field(default_factory= lambda:VS(1,1) )
b: float = 1
c: VS = field(default_factory= lambda:VS(1,2) )
c1 = Container()
c2 = Container()
print(c1)
print(c2)
c1.a.v = -999
c1.c.s = -999
print(c1)
print(c2)
输出:
Container(a=VS(v=1, s=1), b=1, c=VS(v=1, s=2))
Container(a=VS(v=1, s=1), b=1, c=VS(v=1, s=2))
Container(a=VS(v=-999, s=1), b=1, c=VS(v=1, s=-999))
Container(a=VS(v=1, s=1), b=1, c=VS(v=1, s=2))
推荐阅读
- mysql - 无法使用 hive 中的电话号码前缀加入 hive 表
- python - AJAX Django 删除功能不删除对象
- django - 如何在本地将“127.0.0.1:8080”转换为 www.projectname.com”?
- windows-10 - Pdf 文件在 Windows 10 中不受服务跟踪,但在 Windows 7 中它们由服务跟踪
- php - Yii2:未找到“Yii”类
- c++ - 旋转对象 AABB 更新不正确
- android - 片段为空白,但生命周期工作正常
- javascript - Toggle Image On-click Using JavaScript/Jquery in list of divs
- java - 如何将产品部署到依赖 DLL 文件的云?
- python - 如何在python中使用Z分数计算相关性?