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