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

Python单例模式
EN

Stack Overflow用户
提问于 2010-06-14 14:11:01
回答 6查看 2.2K关注 0票数 3

有人可以告诉我为什么这是不正确的单例模式:

代码语言:javascript
复制
class preSingleton(object):
    def __call__(self):
        return self

singleton = preSingleton()

# singleton is actually the singleton

a = singleton()
b = singleton()

print a==b  

a.var_in_a = 100
b.var_in_b = 'hello'

print a.var_in_b
print b.var_in_a

编辑:上面的代码打印:

代码语言:javascript
复制
True
hello
100

非常感谢

第二部分

也许这样更好?

代码语言:javascript
复制
class Singleton(object):
    def __new__(cls):
        return cls

a = Singleton()
b = Singleton()

print a == b

a.var_in_a = 100
b.var_in_b = 'hello'

print a.var_in_b
print b.var_in_a

编辑:上面的代码打印:

代码语言:javascript
复制
True
hello
100

再次感谢。

EN

回答 6

Stack Overflow用户

发布于 2010-06-21 12:04:48

在Python中,单例实际上非常简单。诀窍是让模块为您进行封装,而不是创建一个类。

  • 模块只有在
  • 第一次导入时,模块才会被初始化,直到第一次导入
  • 时,任何重新导入模块的尝试都会返回指向现有导入

的指针。

如果要假装模块是类的实例,则可以执行以下操作

代码语言:javascript
复制
import some_module
class SomeClass(object):
    def __init__(self):
        self.singleton = some_module
票数 9
EN

Stack Overflow用户

发布于 2010-06-14 14:17:56

因为这不是单身。Singleton必须是单身,您的对象不是。

代码语言:javascript
复制
>>> class preSingleton(object):
...     def __call__(self):
...         return self
...
>>> singleton = preSingleton()
>>> singleton2 = preSingleton()
>>> singleton
<__main__.preSingleton object at 0x00C6D410>
>>> singleton2
<__main__.preSingleton object at 0x00C6D290>
票数 3
EN

Stack Overflow用户

发布于 2010-06-14 14:49:58

这实际上是Borg模式。多个共享状态的对象。

这并不是说它有什么问题,而且对于大多数(如果不是全部的话)用例来说,它在功能上等同于单个实例,但是既然您要求.

编辑:当然,因为它们是Borg对象,每个实例都会消耗更多的内存,所以如果您要创建大量内存,这将对资源的使用产生影响。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3037914

复制
相关文章

相似问题

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