Оправдано ли использование класса для хранения переменных, которые необходимы в нескольких функциях? - PullRequest
0 голосов
/ 06 ноября 2019

Я пишу скрипт на Python, и одна из его функций должна заключаться в том, что он автоматически добавляет себя в папку автозагрузки Windows.

Теперь я написал несколько функций, которые бы сделали это для меня, но онивсе полагаются на несколько переменных, которые не должны меняться после первоначального присваивания. Но я не уверен, где их хранить.

Это фрагмент кода:

def write_shortcut():
    autostart_folder = winshell.startup()
    path = os.path.abspath(__file__)
    target_folder = autostart_folder + r"\proxy-changer.lnk"
    working_directory = path.replace(r'\proxy-changer.pyw', '')

    with winshell.shortcut() as shortcut:
        shortcut.path = path
        shortcut.working_directory = working_directory
        shortcut.description = "Shortcut to the proxy-changer script"
        shortcut.write(target_folder)

def del_shortcut():
    os.remove(target_folder)

def check_shortcut():
    if (config.getboolean('DEFAULT','RunOnStartup') == 1 and not
        os.path.islink(target_folder)):
        write_shortcut()
    elif (config.getboolean('DEFAULT','RunOnStartup') == 0 and
          os.path.islink(target_folder)):
        del_shortcut()
    else:
        pass

Строки со 2 по 5 - это переменные, о которых я говорю. В настоящее время они находятся в первой функции, но другие не могут получить к ним доступ. Теперь я знаю, что классы существуют, и переменные внутри класса доступны для всех методов внутри класса, но я не уверен, что это правильный путь, потому что он будет содержать только один объект, а не несколько.

Вне функций, даже до их определения, тоже не выглядит очень чистым. И я не уверен в том, чтобы сделать их глобальными.

Я думаю, что я понимаю классы в целом, но не все, поэтому, если очевидно, что класс будет правильным, тогда извините. Я только что слышал, что классы часто используются, когда они не нужны (Хватит писать классы!) , поэтому я стараюсь избегать той же ошибки. Я новичок в Python, не стесняйтесь критиковать мой стиль кода или скажите, где я ошибаюсь / могу улучшить его.

Заранее спасибо.

1 Ответ

1 голос
/ 06 ноября 2019

Прекрасно иметь константы как глобальные переменные вашего модуля / скрипта. Обратите внимание, что использование констант имен UPPER_CASE идиоматично.

Константы PEP8

Константы обычно определяются на уровне модуля инаписано заглавными буквами с подчеркиванием, разделяющим слова. Примеры включают MAX_OVERFLOW и TOTAL.

Например, вы должны определить константы перед вашими функциями:

PATH = os.path.abspath(__file__)
TARGET_FOLDER = winshell.startup() + r"\proxy-changer.lnk"
WORKING_DIRECTORY = os.path.dirname(PATH)

def write_shortcut():
    with winshell.shortcut() as shortcut:
        shortcut.path = PATH
        shortcut.working_directory = WORKING_DIRECTORY
        shortcut.description = "Shortcut to the proxy-changer script"
        shortcut.write(TARGET_FOLDER)

def del_shortcut():
    os.remove(TARGET_FOLDER)

Использование класса не дает вам никаких преимуществ. Недостатком является то, что он скрывает ваши намерения, он обычно медленнее и не обеспечивает функциональности, обычно связанной с классами.

Самый простой подход заключается в добавлении констант в качестве атрибутов класса:

class Constants:
    path = os.path.abspath(__file__)
    target_folder = winshell.startup() + r"\proxy-changer.lnk"
    working_directory = os.path.dirname(path)

def del_shortcut():
    os.remove(Constants.target_folder)

Обратите внимание, что Constants ведет себя точно так же, как модуль с глобальными переменными, за исключением того, что он по-прежнему обладает всеми бесполезными возможностями класса. Например, хотя Constants можно создать, это совершенно бессмысленно, поскольку экземпляры не имеют ни состояния, ни методов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...