让自己摆脱全局变量的最佳实践



我是自学成才的(在几本书、教程和论坛的大力帮助下),我正在努力戒掉使用全局变量。

现在,当我希望一个变量是"全局的"(也就是说,我不想在函数之间显式传递它)时,我创建了一个名为 Settings 的类,它通常如下所示。

我是在重新发明轮子,还是这是在没有全球污染的情况下访问程序范围变量的适当方法? 有没有更好/更pythonic的方法来实现这一点?

任何想法/建议将不胜感激。

class Settings():
    __current = None
    __old = []
    def __init__(self, setting1=None, setting2=None):
        print("n++++ Initializing Settings ++++")
        self.__setting1 = setting1
        self.__setting2 = setting2
        if Settings.__current:
            Settings.__old.insert(0, Settings.__current)
        Settings.__current = self
    def setting1(self):
        return self.__setting1
    def setting2(self):
        return self.__setting2
    # etc. - several more methods to set/get/process settings
    @classmethod
    def current(cls):
        return cls.__current
    @classmethod
    def old(cls, index):
        try:
            settings = cls.__old[index]
        except IndexError:
            settings = None
        return settings
class Thing():
    list = []
    def __init__(self, name="Thing"):
        print("++ Initializing New Thing: {} ++n".format(name))
        self.name = name
        s = Settings.current()
        print("Global-ish setting1: {}".format(s.setting1()))
        print("Global-ish setting2: {}".format(s.setting2()))
        try:
            print("  --> Previous Global-ish setting2: {}".format(s.old(0).setting2()))
        except AttributeError:
            print("  --> No previous settings")
        Thing.list.append(self)
if __name__ == '__main__':
    settings = Settings(setting1="BloopittyBloop", setting2="FlizzletyFlop")
    newThing = Thing(name="Thing1")
    settings = Settings(setting1="GarbGlat", setting2="FloorMullet")
    anotherNewThing = Thing("Thing3 ate Thing2")
这取决于

Settings对象的目的。如果您这样做是为了个人方便传递数据,那么这就是错误的原因。但是,如果您的应用程序作为不同位置需要的各种配置设置/标志,那么在其周围传递一个Settings对象是一个好主意:它明确了您使用设置的位置,并且您(或其他开发人员)可以看到settings对象最初来自哪里。

但是,如果您需要访问某些变量,但它们实际上不属于Settings对象(它们是其他对象的一部分),则需要将这些变量与另一个对象相关联。例如,如果您有一个桌面应用程序,并且您的Settings对象包含许多地方需要的各种值(GUI 设置、数据库连接详细信息、文件路径等),那么最好创建/加载设置/配置并构造适当的对象(ApplicationWindow类、Database类、 等)。

这意味着您只是将相关的详细信息/对象传递到代码中的每个可能位置,而不是整个配置文件(设置)。这可以防止您意外使用您并不真正需要的其他设置,并保持代码干净。

相关内容

  • 没有找到相关文章

最新更新