首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >让自己远离全球的最佳实践?

让自己远离全球的最佳实践?
EN

Stack Overflow用户
提问于 2014-11-21 10:05:43
回答 1查看 46关注 0票数 0

我是自学成才的(在几本书、教程和论坛中得到了大量帮助),我正在努力避免使用全局变量。

现在,当我想要一个变量是“全局的-ish”(也就是说,我不想将它显式地从一个函数传递到另一个函数)时,我创建一个名为Settings的类,它通常如下所示。

我是在重新发明轮子呢,还是说这是一种不受全球污染的访问程序范围内变量的适当方式?是否有更好的[更多的pythonic ]方法来完成这一任务?

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

代码语言:javascript
复制
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")
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-21 15:32:31

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27058737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档