40. Как использовать глобальные переменные? Это хорошая идея?
port = 443
def change_port():
‧‧‧‧global port
‧‧‧‧port = 8080
change_port()
Хорошая ли это идея? Автор вопроса пытается вывести нас на шаблонный ответ, что конечно же, это идея плохая (он прав). Вся концепция ООП крутится вокруг иерархии, "кто на ком стоял" и "кому что можно, а что нельзя". Однако существуют случаи, когда проще использовать глобальную переменную, особенно в программе, которую ты пишешь сам от начала до конца.
Они и сами по смыслу являются глобальными, некими общими для всей программы сущностями. Например, при написании программ с GUI на QT у нас имеется одна сущность - окно программы, QMainWindow. Мы можем все эти вещи для работы сделать свойствами написанного нами класса, назовем его MyGUI. Отлично, gui = MyGUI() и теперь инстанс этого класса все равно будет использоваться глобально отовсюду, потому что как у нас было одно QMainWindow, так и осталось.
Хорошая ли это идея? В абстракции - нет, фу-фу-фу, нам нужна иерархия, инкапсуляция и вот это вот всё.
А на практике может случиться, что тебе приходится делать именно вот так и никак иначе. На паттерн "синглтон" вроде бы никто не ругается - есть сценарии, когда он нужен. И с глобальными переменными то же самое. Их следует избегать во всех возможных случаях, а в невозможных - картинно закатить глаза, и написать "global".
Это кросспост из моего Telegram-канала "Не Ван Россум", где я прямо сейчас пишу сериал "101 вопрос про Python" с описанием подводных камней, неочевидностей и загвоздок.
#сериал101, #40
