Как объявить переменные в классах данных - PullRequest
0 голосов
/ 23 апреля 2019

Я пытаюсь объявить две переменные в пределах dataclass (y_set_max и y_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: имя y_default_max не определено

Как я могу изменить свой код dataclass, чтобы два оператора печати быливернулся?

Ответы [ 2 ]

2 голосов
/ 24 апреля 2019

Если вы хотите получить доступ к атрибутам экземпляра, вам нужно включить экземпляр в вызов. Хотя определение 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)

Учитывая это определение класса, ваши начальные операторы будут работать правильно:

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
1 голос
/ 23 апреля 2019

Синтаксис такой же, как с подсказками типов и аргументами по умолчанию:

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)

Обратите внимание, что аргументы по умолчанию должны быть последними.Кроме того, вы пропали без вести self в __post_init__.

...