Какой лучший способ отложить инициализацию атрибутов класса? - PullRequest
0 голосов
/ 26 марта 2020

У меня есть следующий вариант использования OO:

class SomeClass(object):

    def __init__(self, arg1):
        self.attr_now = arg1
        self.attr_later = None

    def compute(self):
        # do some lengthy computation ...
        self.attr_later = x # some result
        # continue work ... 

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

1 Ответ

2 голосов
/ 26 марта 2020

Поскольку вы говорите о сценарии использования OO, я думаю, вы должны знать об изменениях доступа, которые вы можете сделать, чтобы защитить атрибут для его значения и типа.

Подумайте об этом

class SomeClass(object):

    def __init__(self, arg1):
        self.__attr_now = arg1
        self.__attr_later = None

    @property
    def attr_later(self):
        return self.__attr_later

    def compute(self):
        # do some lengthy computation ...
        self.__attr_later = x # some result
        # continue work ... 

Переменные экземпляра могут иметь префикс __, чтобы сделать его закрытым для этого экземпляра. Таким образом, вы уверены, что переменная не может быть изменена извне. Более того, создайте property для переменной, чтобы вы могли получить доступ к значению извне.

Если вы думаете, что вы хотите установить значение извне, определите setter и управляйте входящим назначением - что-то вроде

@attr_later.setter
def attr_later(self, attr_val):
    if isinstance(attr_val,str):
        self.__attr_later = attr_val
    else:
        raise 
        # or do damage control

Вы управляете своим экземпляром, если вы правильно инкапсулируете свойства. Надеюсь, что это имеет смысл

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