Как правильно установить атрибут экземпляра из класса, когда атрибут является свойством? - PullRequest
0 голосов
/ 11 февраля 2020

Рассмотрим следующий Python класс. Я хочу установить свойство attr класса A внутри, какой метод является предпочтительным? Я не хочу реализовывать метод установки свойств, потому что пользователю класса нельзя разрешать изменять атрибут.

class A:
    ''' Library code '''
    def __init__(self):
        self._attr = None

    @property
    def attr(self):
        return self._attr

    # first approach
    def _set_attr(self, data):
        # Set the underlying private attribute
        self._attr = data

    # second approach
    def _set_attr2(self, data):
        # This calls __setattr__() of the base class
        setattr(self, '_attr', data)

    # third approach
    def _set_attr3(self, data):
        # Assignes data directly to the instance attribute
        self.__dict__['_attr'] = data

   def sets_attr(self):
        ''' does calculations and only calls the setter when
            result is fulfilling some requirements. '''


class B(A):
    ''' User code - extend on library code
        User can set any attribute name except the protected name  'attr'
    '''


1 Ответ

4 голосов
/ 11 февраля 2020

Я бы не использовал любой подход. Ваш вариант использования неясен, но если вы не хотите, чтобы установщик был доступен, и установка этого атрибута будет выполняться только из какого-то другого внутреннего модуля / класса, который вы предоставляете, без каких-либо специальных действий на множестве, в какой-либо оболочке нет особого смысла Вот. Просто используйте

my_object._attr = value # Or if only within the class itself, then self._attr = value

везде, где вы хотели вызвать сеттер. Сеттер - это API для настройки. Если вы не хотите предоставлять интерфейс для настройки, не делайте этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...