Методы класса Python - PullRequest
       21

Методы класса Python

3 голосов
/ 20 февраля 2010

В Python, какой способ (в стиле) разрешить публичный доступ к переменным объекта?

Есть много вариантов, которые я видел на разных языках, мне было интересно, какой из них (если есть) является предпочтительным методом Python? Вот варианты, которые я сейчас разрываю между:

  1. Разрешить прямой доступ к переменным объекта (например, print (object.variable)), игнорировать скрытие данных
  2. Разрешить доступ к переменным объекта с помощью функции-оболочки:

class X:
    variable_a = 0
    variable_b = 0
...
    def get_variable_a(self):
        return self.variable_a

Если это рекомендуемый способ, как вы называете методы? (get_variablename (), или просто имя переменной и т. д.?)

Что всем рекомендуют для этого?

спасибо!

Lucy

Ответы [ 4 ]

4 голосов
/ 20 февраля 2010

Не беспокойтесь об использовании аксессоров, пока они не понадобятся; преобразование простого атрибута в свойство выполняется быстро и легко и не требует модификации клиентского кода.

Когда я пишу свойство, я использую _get_FOO() и _set_FOO() для методов доступа и _FOO для самого атрибута.

3 голосов
/ 20 февраля 2010

В Python нет "приватных" переменных. Проверьте раздел 9.6 этого документа http://docs.python.org/tutorial/classes.html

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

То же самое с искаженными именами (начиная с 2 подчеркиваний).

2 голосов
/ 20 февраля 2010

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

Обратите внимание, что это ортогонально сокрытию информации. obj.get_some_implementation_detail() не лучше, чем obj.some_implementation_detail.

0 голосов
/ 20 февраля 2010

Вы можете использовать

Методы получения и установки (как Java)

class SomeClass(object):
  ...

  def get_x(self):
    return self._x
  def set_x(self, x):
    self._x = x

c = SomeClass()
print c.get_x()
c.set_x(10)

Свойства (C # как)

class SomeClass(object):
  ...

  def get_x(self):
    return self._x
  def set_x(self, x):
    self._x = x
  x = property(get_x, set_x)

c = SomeClass()
print c.x
c.x = 10

Я думаю, это просто вопрос стиля. Выберите тот, который вам нравится больше. То же самое относится и к соглашению об именах, выберите одно соглашение и придерживайтесь его.

В любом случае сокрытие данных может быть выполнено с помощью псевдоприватных переменных (начиная с двух подчеркиваний). К ним нельзя получить прямой доступ , в отличие от переменных примера (_x не начинается с двух подчеркиваний).

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