Что-то не так с ссылкой на переменную экземпляра без реализации геттера? - PullRequest
0 голосов
/ 02 апреля 2020

Короче говоря, я получаю json событий через API, и недавно я узнал намного больше о классах. Одним из рекомендуемых способов использования классов является реализация методов получения, установки и т. Д. c. Однако мои классы не слишком сложны, все, что они делают, это анализируют данные из объекта json и передают лучше отформатированные данные в дальнейшие Процессы ETL.

Ниже приведен простой пример того, с чем я столкнулся.

data = {'status': 'ready'}


class StatusHandler:
    def __init__(self, data):
        self.status = data.get('status', None)


class StatusHandler2:
    def __init__(self, data):
        self._status = data.get('status', None)

    @property
    def status(self):
        return self._status


without_getter = StatusHandler(data)
print(without_getter.status)

with_getter = StatusHandler2(data)
print(with_getter.status)

Что-то не так со мной, когда я использую класс StatusHandler и ссылаюсь на переменную экземпляра состояния и использую ее для передать информацию вперед другим битам кода? Мне просто интересно, если еще дальше, так как мой проект усложняется, это будет проблемой, поскольку это не кажется стандартным, хотя я могу ошибаться ...

1 Ответ

2 голосов
/ 02 апреля 2020

Смысл методов получения / установки состоит в том, чтобы не заменять доступ к простым атрибутам на вычисленные, не нарушая клиентский код, если и когда вам придется изменить свою реализацию. Это имеет смысл только для языков, которые не поддерживают вычисляемые атрибуты.

Python имеет довольно сильную поддержку вычисляемых атрибутов через протокол дескриптора , включая обобщенный c встроенный тип property, так что вы не не нужны явные методы получения / установки - если вам нужно изменить свою реализацию, просто замените затронутые атрибуты publi c на вычисленные.

Просто убедитесь, что вы не злоупотребляете вычисленными атрибутами - они не должны выполнять тяжелые вычисления, доступ к внешним ресурсам или около того. Никто не ожидает, что то, что выглядит как атрибут, имеет высокую стоимость или повышает IOErrors или около того; -)

EDIT

Что касается вашего примера: вычисляемые атрибуты являются Способ управления доступом к атрибутам и создание атрибута только для чтения (без предоставления установщика для вашего property) - это вполне допустимый вариант использования - ЕСЛИ у вас, конечно, есть причина сделать его доступным только для чтения.

...