Должен ли я использовать "глобальный" или "я". для переменных класса класса в 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 и вам нужно поделиться чем-то между несколькими местами, они могут быть приемлемыми.