Zastanawiałem się, czy byłoby możliwe uniknięcie niektórych wad używania zmiennych globalnych (patrz np. Http://wiki.c2.com/?GlobalVariablesAreBad ) poprzez użycie przestrzeni nazw klas zamiast globalnej / modułowej przestrzeni nazw do przekazywania wartości zmiennych . Poniższy kod wskazuje, że te dwie metody są zasadniczo identyczne. Korzystanie z przestrzeni nazw klas ma pewną przewagę, jak wyjaśniono poniżej.
Poniższe fragmenty kodu pokazują również, że atrybuty lub zmienne mogą być dynamicznie tworzone i usuwane zarówno w globalnych / modułowych przestrzeniach nazw, jak iw przestrzeniach nazw klas.
wall.py
# Note no definition of global variables
class router:
""" Empty class """
Nazywam ten moduł „ścianą”, ponieważ jest używany do odbijania zmiennych od. Będzie działać jako przestrzeń do tymczasowego definiowania zmiennych globalnych i atrybutów całej klasy pustej klasy „router”.
source.py
import wall
def sourcefn():
msg = 'Hello world!'
wall.msg = msg
wall.router.msg = msg
Ten moduł importuje ścianę i definiuje pojedynczą funkcję, sourcefn
która definiuje wiadomość i emituje ją przez dwa różne mechanizmy, jeden poprzez globale, a drugi przez funkcję routera. Zwróć uwagę, że zmienne wall.msg
i wall.router.message
są zdefiniowane tutaj po raz pierwszy w odpowiednich przestrzeniach nazw.
dest.py
import wall
def destfn():
if hasattr(wall, 'msg'):
print 'global: ' + wall.msg
del wall.msg
else:
print 'global: ' + 'no message'
if hasattr(wall.router, 'msg'):
print 'router: ' + wall.router.msg
del wall.router.msg
else:
print 'router: ' + 'no message'
Ten moduł definiuje funkcję, destfn
która wykorzystuje dwa różne mechanizmy do odbierania wiadomości emitowanych przez źródło. Uwzględnia możliwość, że zmienna „msg” może nie istnieć.destfn
usuwa także zmienne po ich wyświetleniu.
main.py
import source, dest
source.sourcefn()
dest.destfn() # variables deleted after this call
dest.destfn()
Ten moduł wywołuje po kolei wcześniej zdefiniowane funkcje. Po pierwszym wywołaniu dest.destfn
zmiennych wall.msg
i wall.router.msg
już nie istnieją.
Dane wyjściowe z programu to:
global: Witaj, świecie!
router: Witaj, świecie!
global: brak wiadomości
router: brak wiadomości
Powyższe fragmenty kodu pokazują, że mechanizm moduł / globalny i mechanizm zmiennej klasy / klasy są zasadniczo identyczne.
Jeśli ma być współdzielonych wiele zmiennych, zanieczyszczeniem przestrzeni nazw można zarządzać za pomocą kilku modułów ściennych, np. Wall1, wall2 itp. Lub definiując kilka klas typu routera w jednym pliku. Ta ostatnia jest nieco uporządkowana, więc być może stanowi marginalną zaletę w stosowaniu mechanizmu zmiennych klas.