Должен ли я использовать «глобальный» или «себя». для переменных области видимости в Python? - PullRequest
15 голосов
/ 08 марта 2011

Оба эти блока кода работают. Есть ли «правильный» способ сделать это?

class Stuff:
    def __init__(self, x = 0):
        global globx
        globx = x
    def inc(self):
        return globx + 1

myStuff = Stuff(3)
print myStuff.inc()

Печать "4"

class Stuff:
    def __init__(self, x = 0):
        self.x = x
    def inc(self):
        return self.x + 1

myStuff = Stuff(3)
print myStuff.inc()

Также печатает "4"

Я нуб, и я работаю с большим количеством переменных в классе. Начал задаваться вопросом, почему я ставлю "себя". перед всем на виду.

Спасибо за вашу помощь!

Ответы [ 3 ]

11 голосов
/ 08 марта 2011

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

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

Нормально иметь явное self во всем вашем коде Python.Если вы попробуете хитрости, чтобы избежать того, что вам будет сложно читать код для других программистов на Python (и, возможно, вносить дополнительные ошибки)

8 голосов
/ 08 марта 2011

Есть 2 способа для «переменных области видимости класса». Одним из них является использование self, это называется переменной экземпляра, каждый экземпляр класса имеет свою собственную копию переменных экземпляра; другой - определить переменные в определении класса, это может быть достигнуто с помощью:

class Stuff:
  globx = 0
  def __init__(self, x = 0):
    Stuff.globx = x 
  ...

Это называется атрибутом класса, к которому Stuff.globx может обращаться напрямую, и он принадлежит классу, а не экземплярам класса, как статические переменные в Java.

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

Пространство имен и связанная с ним концепция представлены в руководстве по Python здесь.

1 голос
/ 08 марта 2011

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

Глобальные переменные - это отдельная история. Они, ну, глобально - у у всех есть тот же самый. Это почти никогда не является хорошей идеей (по причинам, объясненным во многих случаях), но если вы просто пишете быстрый и грязный сценарий и хотите поделиться чем-то между несколькими местами, они могут быть приемлемыми.

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