让自己脱离全局的最佳做法?

时间:2014-11-21 10:05:43

标签: python-3.x global-variables global

我是自学成才(在几本书,教程和论坛中提供了很多帮助),而且我试图让自己不再使用全局变量。

现在,当我想要一个变量为" global-ish" (也就是说,我不想在函数之间明确地传递它),我创建了一个名为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")

1 个答案:

答案 0 :(得分:0)

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

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

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