Должен ли я использовать "глобальный" или "я". для переменных класса класса в Python?

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

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"

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

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

Ответ 1

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

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

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

Ответ 2

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

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

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

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

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

Ответ 3

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

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