Python 3.7: инициализировать объекты с помощью модуля классов данных?

Вот мой код на Python 3.6

class A(object)

    def __init__(self, a: str):
        self._int_a: int = int(a)  # desired composition

    def get_int_a(self) -> int:
        return self._int_a   

Я хочу переписать этот код в python 3.7, как я могу инициализировать self._int_a: int = int(a) модулем dataclasses?

Я знаю, что могу сделать что-то подобное, но не могу понять, как инициализировать _a: int = int(a) или что-то подобное.

from dataclasses import dataclass


@dataclass
class A(object):
    _a: int = int(a)  # i want to get initialized `int` object here

def get_int_a(self) -> int:
    return self._a

Заранее благодарим за ваши идеи и предложения.


person Vladimir Yahello    schedule 12.07.2018    source источник


Ответы (1)


Полностью откажитесь от геттеров и сеттеров и просто используйте доступ к атрибутам. Мы можем определить поле только для инициализации, которое принимает строку а затем преобразовать эту строку в целочисленное поле в нашем _1 _ звони.

from dataclasses import dataclass, InitVar, field

@dataclass
class A:
    temp: InitVar[str]
    a: int = field(init=False)
    def __post_init__(self, temp):
        self.a = int(temp)

x = A("1")
print(type(x.a), x.a)
# <class 'int'> 1
person Patrick Haugh    schedule 12.07.2018
comment
Что я не могу понять с механизмом, так это то, что в конце temp остается как поле для конечного объекта ... Механизм класса данных должен полностью удалить его из полей (как это делается при вызове метода fields уровня модуля, но не сделано в __dataclass_fields__). - person Cedric H.; 31.07.2020
comment
Я не уверен, что понимаю, что вы говорите. x.temp должен привести к ошибке AttributeError - person Patrick Haugh; 01.08.2020
comment
Действительно, я был сбит с толку, это приводит к AttributeError, как и ожидалось. - person Cedric H.; 02.08.2020
comment
Хорошо, теперь я понимаю, в чем была проблема: представьте тот же пример, но теперь укажите значение по умолчанию для temp в определении класса. Теперь у вас нет AttributeError, что странно. - person Cedric H.; 03.08.2020