Ответ в двух словах
В вашем примере 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 мы используем selfas 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 являются экземплярами и, следовательно, самими объектами, что дает новое понимание для понимания вышеизложенного. Вернитесь и прочтите это еще раз позже, как только вы это поймете.