首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python中的单例模式

Python中的单例模式
EN

Stack Overflow用户
提问于 2018-09-16 13:49:19
回答 1查看 12.4K关注 0票数 2

我是Python的新手,我正在尝试通过检查和创建Python设计模式的示例来学习这门语言。

我对Singleton模式的经典实现感到困惑。大多数文章都将Singleton的实现作为经典

代码语言:javascript
复制
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

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

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

代码语言:javascript
复制
class Singleton(object):
    _instances = {}

    def __new__(class, *args, **kwargs):
        if class not in class._instances:
            instance = super().__new__(class)
            class.__instances[class] = instance
        return class._instances[class]

这让我头晕目眩。有人能给我解释一下这是怎么回事吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-16 14:06:12

首先要记住的是Python is not Java。它不像其他语言那样有限制。正如Guido所说,“我们都是成年人了”。没有什么能真正阻止你用Python做大多数事情。解决方案是“不要那样做”。

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

代码语言:javascript
复制
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
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52351312

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档