Jak w przypadku wszystkich dobrych przykładów, uprościliśmy to, co faktycznie próbujesz zrobić. To dobrze, ale warto zauważyć, że Python ma dużą elastyczność, jeśli chodzi o zmienne klas i instancji. To samo można powiedzieć o metodach. Aby uzyskać dobrą listę możliwości, polecam przeczytanie wprowadzenia do zajęć w nowym stylu Michaela Fötscha , zwłaszcza części od 2 do 6.
Na początku trzeba dużo pracy zapamiętać, że Python to nie java. Więcej niż banał. W Javie kompilowana jest cała klasa, dzięki czemu rozwiązywanie przestrzeni nazw jest naprawdę proste: wszelkie zmienne zadeklarowane poza metodą (gdziekolwiek) są zmiennymi instancji (lub, jeśli są statyczne, klasowe) i są niejawnie dostępne w ramach metod.
W Pythonie główną zasadą jest to, że istnieją trzy przestrzenie nazw, które są przeszukiwane w kolejności pod kątem zmiennych:
- Funkcja / metoda
- Bieżący moduł
- Wbudowane
{begin pedagogy}
Istnieją ograniczone wyjątki od tej reguły. Głównym, który przychodzi mi do głowy, jest to, że podczas ładowania definicji klasy definicja klasy jest jej własną niejawną przestrzenią nazw. Ale to trwa tylko tak długo, jak długo moduł jest ładowany i jest całkowicie pomijane, gdy znajduje się w metodzie. A zatem:
>>> class A(object):
foo = 'foo'
bar = foo
>>> A.foo
'foo'
>>> A.bar
'foo'
ale:
>>> class B(object):
foo = 'foo'
def get_foo():
return foo
bar = get_foo()
Traceback (most recent call last):
File "<pyshell#11>", line 1, in <module>
class B(object):
File "<pyshell#11>", line 5, in B
bar = get_foo()
File "<pyshell#11>", line 4, in get_foo
return foo
NameError: global name 'foo' is not defined
{end pedagogy}
W końcu, rzeczą do zapamiętania jest to, że nie ma dostępu do żadnej z tych zmiennych, które chcesz otworzyć, ale chyba nie w sposób dorozumiany. Jeśli Twoje cele są proste i nieskomplikowane, prawdopodobnie wystarczy Foo.bar lub self.bar. Jeśli Twój przykład staje się bardziej skomplikowany lub chcesz robić wymyślne rzeczy, takie jak dziedziczenie (możesz dziedziczyć metody statyczne / klasowe!), Lub pomysł odwoływania się do nazwy twojej klasy w samej klasie wydaje ci się zły, sprawdź intro, które połączyłem.