我正在考虑在我的项目中使用Singleton模式,因此我搜索了StackOverflow以找到实现它的pythonic方法。我发现this question的答案是“一个带有函数的模块(而不是一个类)可以很好地用作单例”。另一方面,第二个答案建议使用the Borg pattern。对我来说,使用模块是一个简单而直接的解决方案,所以我想了解何时使用Borg更可取。
答案 0 :(得分:3)
不同之处在于,在Borg模式中,您将拥有不同的对象,其属性相同,而使用模块版本则会获得一个对象(模块)。
另外一个对象和一个模块略有不同:你不能挑选模块,但你可以挑选类。此外,您可以对对象进行操作(>,<,+, - 等)
有点偏离主题:通过一些修改,Borg模式可以用作一个非常简单的Multiton:
class Multiton(object):
__shared_states = {}
def __init__(self, name):
if not self.__shared_states.has_key(name):
self.__shared_states[name] = {}
self.__dict__ = self.__shared_states[name]
答案 1 :(得分:3)
单例和模块仅代表一个实例,适用于所有应用程序生命周期。即使不需要,该实例也会被实例化。
borg模式是关于共享状态的。每个客户端类都将创建一个borg的新实例,但该实例将在不再需要时被处理 - 这是一种更优雅的方法。
除此之外,继承或模拟博格更容易。
答案 2 :(得分:1)
您可以使用静态类吗? SO Question
class Test(object):
i = 3 # class (or static) variable
@classmethod
def g(cls, arg):
# here we can use 'cls' instead of the class name (Test)
if arg > cls.i:
cls.i = arg # would the the same as Test.i = arg1
答案 3 :(得分:1)
我有一个用例,其中borg模式闪耀:
您无法在模块级别将函数定义为@property。如果你想要一些返回动态属性的常见数据(比如config),可以从Borg派生它,然后编写属性方法。