Доступ к закрытым переменным, когда для них есть геттер / сеттер - PullRequest
0 голосов
/ 26 октября 2010

У меня есть вопрос о правильном способе программирования в Python ... Может быть, может быть несколько разных мнений, но здесь это идет:

Допустим, у меня есть класс с парой приватных атрибутов, и я реализовал два метода получения / установки (не перегружая __getattr__ и __setattr__, но в более «Java-тистическом» стиле):

class MyClass:

    def __init__(self):   
        self.__private1 = "Whatever1"

    def setPrivate1(self, private1):
        if isinstance(private1, str) and (private1.startswith("private")):
            self.__private1 = private1
        else:
            raise AttributeError("Kaputt")

    def getPrivate1(self):
        return self.__private1

Теперь, скажем, несколькими строками ниже, в другом методе того же класса, мне нужно заново установить значение этого «_ private1». Поскольку это тот же класс, у меня все еще есть прямой доступ к закрытому атрибуту self. _private1.

Мой вопрос: стоит ли мне использовать:

self.setPrivate1("privateBlaBlaBla")

или я должен получить прямой доступ как:

self.__private1 ="privateBlaBlaBla"

так как я задаю новое значение, я знаю, что указанное значение («privateBlaBlaBla») является правильным (str (), которое начинается с «private»), поэтому оно не оставит систему несовместимой. С другой стороны, если другой программист берет мой код и ему нужно изменить функциональность для атрибута self .__ private1, ему нужно будет пройти весь код и посмотреть, было ли значение __private1 вручную установлено где-то еще.

Полагаю, что правильнее всего всегда использовать метод setPrivate1 и обращаться только к переменной __private1 в get / set, но я хотел бы узнать мнение более опытных программистов на Python.

Спасибо!

Ответы [ 2 ]

6 голосов
/ 26 октября 2010

Вы не можете представить классический пример плохого Python, а затем ожидать, что у людей будет мнение о том, что с этим делать. Используйте геттеры и сеттеры.

class MyClass:
    def __init__(self):   
        self._private1 = "Whatever1"

    @property
    def private1(self):
        return self._private1

    @private1.setter
    def private1(self, value):
        self._private1 = value

Дополнительный комментарий - использование двойных имен подчеркивания может ввести в заблуждение, потому что Python фактически искажает имя, чтобы остановить доступ к ним извне класса. Это не обеспечивает реальной безопасности, но не вызывает головной боли. Самый простой способ избежать головной боли - использовать имена, состоящие из одного подчеркивания, что по сути является универсальным соглашением для private. (Иш.)


Если вам нужно мнение - используйте свойства =). Если вам нужно мнение о вашем чудовище JavaPython, я бы использовал сеттер - в конце концов, вы написали это, это то, что он там! Нет очевидных преимуществ для установки переменной вручную, но есть несколько недостатков.

2 голосов
/ 26 октября 2010

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

class MyClass:

    def __init__(self):   
        self._private1 = "Whatever1"
    @property
    def private1(self):
        return self._private1
    @private1.setter
    def private1(self, private1):
        if isinstance(private1, str) and (private1.startswith("private")):
            self._private1 = private1
        else:
            raise AttributeError("Kaputt")

Затем в своем коде установите атрибут _private1 с помощью

self.private1="privateBlaBlaBla"
...