我是自学成才的(在几本书、教程和论坛的大力帮助下),我正在努力戒掉使用全局变量。
现在,当我希望一个变量是"全局的"(也就是说,我不想在函数之间显式传递它)时,我创建了一个名为 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
类、 等)。
这意味着您只是将相关的详细信息/对象传递到代码中的每个可能位置,而不是整个配置文件(设置)。这可以防止您意外使用您并不真正需要的其他设置,并保持代码干净。