我是自学成才的(在几本书、教程和论坛中得到了大量帮助),我正在努力避免使用全局变量。
现在,当我想要一个变量是“全局的-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")发布于 2014-11-21 15:32:31
这取决于Settings对象的用途。如果你这样做是为了个人方便,那么这就是错误的原因。但是,如果您的应用程序作为在不同地方需要的各种配置设置/标志,那么在它周围传递一个Settings对象是一个好主意:它使其明确您使用设置的位置,并且您(或其他开发人员)可以看到settings对象最初来自何处。
但是,如果您需要访问某些变量,但它们并不真正属于Settings对象(它们是其他对象的一部分),那么您需要将这些变量与另一个对象关联起来。例如,如果您有一个桌面应用程序,并且您的Settings对象包含许多地方需要的各种值(GUI设置、数据库连接细节、文件路径等)然后,最好创建/加载设置/配置,并构造适当的对象( ApplicationWindow类、Database类等)。
这意味着您只将相关的详细信息/对象传递给代码中的每个可能的位置,而不是整个配置文件(设置)。这可以防止您意外地使用您不需要的其他设置,并使代码保持干净。
https://stackoverflow.com/questions/27058737
复制相似问题