Відповідь, кількома словами
У вашому прикладі 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як 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 - це екземпляри і, отже, самі об'єкти, що дає нове розуміння розуміння вищезазначеного. Поверніться і прочитайте це ще раз пізніше, як тільки ви це зрозумієте.