0

我正在编写一个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 初学者,请随时批评我的代码风格或告诉我哪里错了/可以改进它。

提前致谢。

4

1 回答 1

1

将常量作为模块/脚本的全局变量是非常好的。请注意,将 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可以实例化,但这完全没有意义,因为实例既没有状态也没有方法。

于 2019-11-06T12:42:26.840 回答