如何在数据类中声明变量

How to declare variables in dataclasses

我试图在 dataclassy_set_maxy_set_min)中声明两个变量。下面是我的代码:

from dataclasses import dataclass

@dataclass
class Ymax_ymin: #has to be object inside the brackets
    y_default_max: int #500
    y_default_min: int #0
    current: int
    recommended: int

    def __post_init__(self):
          self.y_set_max = max(y_default_max,current,recommended)
          self.y_set_min = min(y_default_min,current,recommended)

current = 800
recommended = 650

set_axis = Ymax_ymin(500,0,current,recommended)

print(set_axis.y_set_max)
print(set_axis.y_set_min)

这是抛出错误:NameError: name y_default_max is not defined

如何修改我的 dataclass 代码以便返回两个打印语句?

语法与类型提示和默认参数相同:

from dataclasses import dataclass

@dataclass
class Ymax_ymin: #has to be object inside the brackets
    current: int
    recommended: int
    y_default_max: int = 500
    y_default_min: int = 0

    def __post_init__(self):
        self.y_set_max = max(self.y_default_max, current, recommended)
        self.y_set_min = min(self.y_default_min, current, recommended)

current = 800
recommended = 650

set_axis = Ymax_ymin(500, 0, current, recommended)

print(set_axis.y_set_max)
print(set_axis.y_set_min)

请注意,默认参数必须排在最后。此外,您在 __post_init__ 中遗漏了 self

如果你想访问一个实例的属性,你需要在调用中包含该实例。虽然 dataclass 定义向您隐藏了构造函数,其中传入的 y_default_max 被读入 self.y_default_max,但它仍然发生,如果您想要实例属性,则需要包括self..

此外,如果您想根据其他属性计算 dataclass' 属性,您可以使用 init=False 来声明它并仍然获得类型提示等:

from dataclasses import dataclass, field


@dataclass
class YmaxYmin:
    current: int
    recommended: int
    y_default_max: int = 500
    y_default_min: int = 0
    y_set_max: int = field(init=False)
    y_set_min: int = field(init=False)

    def __post_init__(self):
        self.y_set_max = max(self.y_default_max, self.current, self.recommended)
        self.y_set_min = min(self.y_default_min, self.current, self.recommended)

鉴于此 class 定义,您的初始语句将 运行 正确:

set_axis = YmaxYmin(current=500, recommended=0, y_default_max=800, y_default_min=650)

print(set_axis.y_set_max)  # prints 800
print(set_axis.y_set_min)  # prints 0