Python中的单例模式

时间:2018-09-16 05:49:19

标签: python design-patterns

我是Python的新手,我试图通过检查并创建Python设计模式示例来学习这种语言。

我对Singleton Pattern的经典实现感到困惑。那里的大多数文章都提到将Singleton实现为经典

<link rel="stylesheet" href="cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css">
<link rel="shortcut icon" type="image/png" href="pictures/pinky.png">
<script src="use.fontawesome.com/0c9491c5b9.js"></script>

但是我对这种实现方式并不完全信服,因为在任何地方我们都没有限制用户创建Singleton类的多个对象,并且我仍然可以通过调用Singleton()创建此类的实例。在Java中,我们通过将类的构造函数设置为Private来防止这种情况。

有人指出我的另一个实现是

class Singleton(object):
    name = None

    @staticmethod
    def instance():
        if '_instance' not in Singleton.__dict__:
            Singleton._instance = Singleton()

        return Singleton._instance


s1 = Singleton().instance();
s2 = Singleton().instance();

assert s1 is s2

这使我头昏了头脑。有人可以解释一下这是怎么回事吗?

1 个答案:

答案 0 :(得分:6)

要记住的第一件事是Python is not Java。它不像其他语言那样严格。正如Guido所说,“我们都是成年人”。没有什么真正阻止您使用Python执行大多数操作的。解决的办法是“不要那样做”。

但是,有几种方法可以做单例。对用户来说看起来更“自然”的另一种方法是使用看起来像类实例化的工厂函数。这是一个例子。

class _Singleton:
    _instance = None

    def hello(self):
        print("Hello!")


def Singleton():
    if _Singleton._instance is None:
        _Singleton._instance = _Singleton()
    return _Singleton._instance



s1 = Singleton()
s2 = Singleton()

assert s1 is s2
相关问题