Мені було цікаво, чи можна було б уникнути деяких недоліків використання глобальних змінних (див., Наприклад, http://wiki.c2.com/?GlobalVariablesAreBad ), використовуючи простір імен класів, а не глобальний / ім'я модуля для передачі значень змінних . Наступний код вказує, що два способи по суті однакові. Існує невелика перевага у використанні просторів імен класів, як пояснено нижче.
Наступні фрагменти коду також показують, що атрибути чи змінні можуть динамічно створюватися та видалятися як у глобальних / модульних просторах імен, так і у просторах імен класів.
wall.py
# Note no definition of global variables
class router:
""" Empty class """
Я називаю цей модуль "стіною", оскільки він використовується для відмови від змінних. Він буде діяти як простір для тимчасового визначення глобальних змінних та загальнокласних атрибутів порожнього класу "маршрутизатор".
source.py
import wall
def sourcefn():
msg = 'Hello world!'
wall.msg = msg
wall.router.msg = msg
Цей модуль імпортує стіну і визначає єдину функцію, sourcefn
яка визначає повідомлення і випромінює його за допомогою двох різних механізмів: один через глобальні та один через функцію маршрутизатора. Зауважте, що змінні wall.msg
та wall.router.message
тут визначені вперше у відповідних просторах імен.
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'
Цей модуль визначає функцію, destfn
яка використовує два різні механізми для отримання повідомлень, що випромінюються джерелом. Це допускає можливість того, що змінна 'msg' може не існувати. destfn
також видаляє змінні після їх відображення.
main.py
import source, dest
source.sourcefn()
dest.destfn() # variables deleted after this call
dest.destfn()
Цей модуль викликає попередньо визначені функції послідовно. Після першого виклику dest.destfn
змінних wall.msg
і wall.router.msg
більше не існує.
Вихід з програми:
global: Привіт, світ!
маршрутизатор: Привіт, світ!
global: немає
маршрутизатор повідомлень : немає повідомлення
Вищенаведені фрагменти коду показують, що модуль / глобальний механізм і механізми змінних класу / класу по суті однакові.
Якщо необхідно поділити багато змінних, забрудненням простору імен можна керувати або за допомогою декількох модулів типу стіни, наприклад, wall1, wall2 тощо, або шляхом визначення декількох класів типу маршрутизатора в одному файлі. Останній трохи охайніший, тому, можливо, являє собою граничну перевагу для використання механізму змінної класу.