В Python, как лучше всего избегать использования одного и того же имени для аргумента __init__ и переменной экземпляра? - PullRequest
2 голосов
/ 28 апреля 2011

Каков наилучший способ инициализации переменных экземпляра в функции init . Это плохой стиль, чтобы использовать одно и то же имя дважды?

class Complex:
     def __init__(self, real, imag):
         self.real = real
         self.imag = imag

Мне кажется небрежно придумывать произвольные альтернативные имена, подобные этому:

class Complex:
     def __init__(self, realpart, imagpart):
         self.r = realpart
         self.i = imagpart

Я не думаю, что это рассматривается в руководстве по стилю PEP 8. Это просто говорит о том, что имена переменных и методов экземпляра должны быть в нижнем регистре с подчеркиванием, разделяющим слова.

Ответы [ 2 ]

13 голосов
/ 28 апреля 2011

Возможно, это субъективно, но я бы не посчитал плохим стилем использовать одно и то же имя дважды. Поскольку self не является неявным в Python, self.real и real полностью различны, и нет опасности скрытия имен и т. Д., Как вы могли бы увидеть в других языках (например, C ++ / Java, где именование параметров, таких как члены несколько нахмурился).

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

4 голосов
/ 28 апреля 2011

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

class MyClass:
  def __init__(self, x, y):
    self._x, self._y = x, y

  @property
  def x(self):
    return self._x

  @x.setter
  def x(self, value):
    print "X is read only."

  @property
  def y(self):
    return self._y

  @y.setter
  def y(self, value):
    self._y = value

Это создаст класс, который позволяет создавать экземпляры с двумя значениями, x и y, но где x не может быть изменено, в то время как y может.

В общем, повторное использование одного и того же имени для переменной экземпляра понятно и уместно.

...