Odpowiedź w kilku słowach
W twoim przykładzie itsProblem
jest zmienną lokalną.
Musisz użyć self
do 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.itsProblem
jest 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 self
as this
, ale to trochę więcej. self
jest pierwszym argumentem dowolnej metody obiektu, ponieważ pierwszy argument jest zawsze odwołaniem do obiektu. Jest to automatyczne, czy tak nazywasz, self
czy 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 self
tylko 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.