python - 如何在数据类字段中引用“self”?
问题描述
我正在尝试做相当于:
class A:
def __init__(self):
self.b = self.get_b()
def get_b(self):
return 1
使用@dataclass
. 我想在@dataclass
这里使用 a 因为还有其他(省略的)字段从提供的构造函数参数初始化。b
是从实例方法的结果初始化的字段之一。执行这个:
@dataclass
class A:
b = self.get_b()
def get_b(self):
return 1
表明self
未在b
's 范围内定义。可以参考self
这里吗?
解决方案
使用__post_init__
方法。
from dataclasses import dataclass, field
@dataclass
class A:
b: int = field(init=False)
def __post_init__(self):
self.b = self.get_b()
不完全是一种改进,是吗?分配给字段的默认值等价于 中的默认参数值__init__
,例如,
def __init__(self, b=0):
self.b = b
就像你不能self
在这样的参数中使用默认值一样,你也不能将它用作字段默认值。默认值必须在实例实际存在之前存在。
我们显式地创建该字段以便我们可以传递init=False
,从而防止生成的__init__
方法期望一个参数来初始化self.b
。
如果函数get_b
真的独立于实例(也就是说,您不需要实例A
来返回值1
),您可以使用已经定义的函数作为默认工厂。
from dataclasses import dataclass, field
@dataclass
class A:
def get_b(self=None):
return 1
b: int = field(default_factory=get_b, init=False)
在这里,get_b
将作为具有零参数的函数(因此self
定义中的默认值)被调用,而不是从类实例中调用。不过,这是相当不正统的,我不建议您像这样构建您的代码。
推荐阅读
- java - 按钮不显示日志或吐司
- apache-flink - Flink:仅在会话窗口结束时计算
- html - 使用 rem 声明的标题边距的参考属性是什么?
- mongodb - MongoDB:在嵌套数组中更新
- android - 使用 Flutter 执行任务 ':app:processReleaseResources' image_picker 失败
- java - 包 org.junit 不存在 Java Netbeans
- bash - 这个 bash 脚本中的两颗星在做什么?只是否定?
- python - 跨多个 GPU 分布 Keras 模型
- java - 四胜玩家对电脑
- gradle - Gradle 找不到 Gson 2.5