【发布时间】:2011-06-06 16:25:03
【问题描述】:
我想在我的 Python 程序中实现某种单例模式。我想在不使用类的情况下这样做;也就是说,我想将所有与单例相关的函数和变量放在一个模块中,并认为它是一个真正的单例。
例如,假设这是在文件'singleton_module.py'中:
# singleton_module.py
# Singleton-related variables
foo = 'blah'
bar = 'stuff'
# Functions that process the above variables
def work(some_parameter):
global foo, bar
if some_parameter:
bar = ...
else:
foo = ...
然后,程序的其余部分(即其他模块)将像这样使用这个单例:
# another_module.py
import singleton_module
# process the singleton variables,
# which changes them across the entire program
singleton_module.work(...)
# freely access the singleton variables
# (at least for reading)
print singleton_module.foo
这对我来说似乎是个好主意,因为它在使用单例的模块中看起来非常干净。
然而,单例模块中所有这些乏味的“全局”语句都很丑陋。它们出现在处理单例相关变量的每个函数中。在这个特定的示例中,这并不算多,但是当您有 10 多个变量要跨多个函数进行管理时,它就不漂亮了。
此外,如果您碰巧忘记了全局语句,这很容易出错:将创建函数的本地变量,并且不会更改模块的变量,这不是您想要的!
那么,这会被认为是干净的吗?有没有类似于我的方法可以消除“全球”混乱?
或者这根本就不是要走的路?
【问题讨论】:
-
为什么首先需要一个单例。似乎 90% 认为他们想要/需要单身人士的人真的不这样做。
-
好吧,我当然并不真正需要单身人士。我曾经使用过一个类,它工作得很好,但我想,既然我只有一个这个特定类的实例,我不能让它成为一个单例吗?
-
好吧,既然你已经发现了单例的一个问题,我会说班级获胜;)
-
有人可能会争辩说,如果你确实需要一个单例 - 它的状态越少越好。如果你最终得到太多
globals,也许这也是糟糕设计的标志?另见stackoverflow.com/questions/137975/… :)