Ответ в двух словах
В вашем примере itsProblem
это локальная переменная.
Вы должны использовать self
для установки и получения переменных экземпляра. Вы можете установить его в __init__
методе. Тогда ваш код будет:
class Example(object):
def __init__(self):
self.itsProblem = "problem"
theExample = Example()
print(theExample.itsProblem)
Но если вам нужна настоящая переменная класса, используйте имя класса напрямую:
class Example(object):
itsProblem = "problem"
theExample = Example()
print(theExample.itsProblem)
print (Example.itsProblem)
Но будьте осторожны с этой переменной , так как theExample.itsProblem
она автоматически устанавливается равной Example.itsProblem
, но не является той же самой переменной и может быть изменена независимо.
Некоторые объяснения
В Python переменные можно создавать динамически. Таким образом, вы можете сделать следующее:
class Example(object):
pass
Example.itsProblem = "problem"
e = Example()
e.itsSecondProblem = "problem"
print Example.itsProblem == e.itsSecondProblem
отпечатки
Правда
Следовательно, это именно то, что вы делаете с предыдущими примерами.
Действительно, в Python мы используем self
as this
, но это немного больше. self
является первым аргументом любого метода объекта, потому что первым аргументом всегда является ссылка на объект. Это происходит автоматически, называете вы это self
или нет.
Это означает, что вы можете:
class Example(object):
def __init__(self):
self.itsProblem = "problem"
theExample = Example()
print(theExample.itsProblem)
или же:
class Example(object):
def __init__(my_super_self):
my_super_self.itsProblem = "problem"
theExample = Example()
print(theExample.itsProblem)
Это точно так же. Первым аргументом метода ЛЮБОГО объекта является текущий объект, мы вызываем его self
только по соглашению. И вы добавляете к этому объекту просто переменную, как если бы вы это делали извне.
Теперь о переменных класса.
Когда вы это сделаете:
class Example(object):
itsProblem = "problem"
theExample = Example()
print(theExample.itsProblem)
Вы заметите, что мы сначала устанавливаем переменную класса , а затем получаем доступ к переменной объекта (экземпляра) . Мы никогда не устанавливаем эту объектную переменную, но она работает, как это возможно?
Ну, Python пытается сначала получить переменную объекта, но если не может ее найти, выдаст вам переменную класса. Предупреждение: переменная класса совместно используется экземплярами, а переменная объекта - нет.
В заключение, никогда не используйте переменные класса для установки значений по умолчанию для переменных объекта. Используйте __init__
для этого.
В конце концов вы узнаете, что классы Python являются экземплярами и, следовательно, самими объектами, что дает новое понимание для понимания вышеизложенного. Вернитесь и прочтите это еще раз позже, как только вы это поймете.