Odpowiedź w kilku słowach
W twoim przykładzie itsProblemjest zmienną lokalną.
Musisz użyć selfdo ustawiania i pobierania zmiennych instancji. Możesz to ustawić w __init__metodzie. Wtedy twój kod wyglądałby tak:
class Example(object):
def __init__(self):
self.itsProblem = "problem"
theExample = Example()
print(theExample.itsProblem)
Ale jeśli chcesz prawdziwej zmiennej klasy, użyj bezpośrednio nazwy klasy:
class Example(object):
itsProblem = "problem"
theExample = Example()
print(theExample.itsProblem)
print (Example.itsProblem)
Ale uważaj na tę zmienną , ponieważ theExample.itsProblemjest automatycznie ustawiana na równą Example.itsProblem, ale nie jest wcale tą samą zmienną i może być zmieniana niezależnie.
Kilka wyjaśnień
W Pythonie zmienne można tworzyć dynamicznie. Dlatego możesz wykonać następujące czynności:
class Example(object):
pass
Example.itsProblem = "problem"
e = Example()
e.itsSecondProblem = "problem"
print Example.itsProblem == e.itsSecondProblem
wydruki
Prawdziwe
Dlatego właśnie to robisz w poprzednich przykładach.
Rzeczywiście, w Pythonie używamy selfas this, ale to trochę więcej. selfjest pierwszym argumentem dowolnej metody obiektu, ponieważ pierwszy argument jest zawsze odwołaniem do obiektu. Jest to automatyczne, czy tak nazywasz, selfczy nie.
Co oznacza, że możesz:
class Example(object):
def __init__(self):
self.itsProblem = "problem"
theExample = Example()
print(theExample.itsProblem)
lub:
class Example(object):
def __init__(my_super_self):
my_super_self.itsProblem = "problem"
theExample = Example()
print(theExample.itsProblem)
To jest dokładnie to samo. Pierwszym argumentem metody obiektowej ANY jest obiekt bieżący, nazywamy to selftylko konwencją. Dodajesz tylko zmienną do tego obiektu, tak samo jak robisz to z zewnątrz.
A teraz o zmiennych klasowych.
Kiedy robisz:
class Example(object):
itsProblem = "problem"
theExample = Example()
print(theExample.itsProblem)
Zauważysz, że najpierw ustawiliśmy zmienną klasy , a następnie uzyskujemy dostęp do zmiennej obiektu (instancji) . Nigdy nie ustawiliśmy tej zmiennej obiektu, ale działa, jak to możliwe?
Cóż, Python próbuje najpierw pobrać zmienną obiektu, ale jeśli nie może jej znaleźć, poda zmienną klasy. Ostrzeżenie: zmienna klasy jest wspólna dla instancji, a zmienna obiektu nie.
Podsumowując, nigdy nie używaj zmiennych klas do ustawiania domyślnych wartości zmiennych obiektowych. Użyj __init__do tego.
W końcu dowiesz się, że klasy Pythona są instancjami, a zatem same obiektami, co daje nowy wgląd w zrozumienie powyższego. Wróć i przeczytaj to ponownie później, kiedy już to zrozumiesz.