Python 如何实现单例模式

309 天前
 zywscq

模版如下:

class Singleton:
    __instance = None
    def __new__(cls, *args):
        if cls.__instance is None:
            cls.__instance = object.__new__(cls, *args)
        return cls.__instance

原文链接: https://medium.com/techtofreedom/3-levels-of-understanding-the-singleton-pattern-in-python-4bf429a10438?sk=392159676dc87218a1b7b8c6830bc277

1926 次点击
所在节点    Python
9 条回复
vicalloy
309 天前
我一直没明白为啥这么多人不遗余力的在 Python 里给出各种不同的单例子实现方法。
对于 Python 来说最简单的单例不应当就是这样吗

singleton = Singleton()

或者你想要 lazy
_singleton: Singleton = None

def get_singleton():
global _singleton
if _singleton is None:
_singleton = Singleton()
return _singleton
fcfangcc
309 天前
赞同 1 楼,全局变量一把梭
QiShine
309 天前
OOP 都快成了一种邪教
wzwwzw
309 天前
可以比一楼 在优雅一点,把放到 TLS 里面可以了。
```python
import threading

_tls - threading.local()

def get_singleton():

if not hasattr(_tls, 'single'):
_tls.single = Singleton()

return _tls.single
```
julyclyde
309 天前
@wzwwzw 你这个是不是“每个线程”一例啊?
vicalloy
309 天前
另外 Java 里的单例构造函数是私有的,你只能通过特定的方法来获取实例,这样你会明确的知道这个类是单例。
对于大多 Python 里的单例,用的地方都 Singleton() 这么来一下。除了看文档,或是在类的名字上加个 Singleton ,根本就没法知道这个类是单例。
wzwwzw
309 天前
@julyclyde 可以这么理解,Python 的多线程是复杂的。
CHchenkeyi
309 天前
在 A 文件中创建对象,并在其他文件引入
lolizeppelin
308 天前
用元类装饰器

```python
class Singleton(type):
_instances = {}
_semaphores = lockutils.Semaphores()

def __call__(cls, *args, **kwargs):
with lockutils.lock('singleton_lock', semaphores=cls._semaphores):
if cls not in cls._instances:
cls._instances[cls] = super(Singleton, cls).__call__(
*args, **kwargs)
return cls._instances[cls]

singleton = six.add_metaclass(Singleton)


@singleton
class Myclass():
....


```


写一个通用的非常方便

缺点时候被装饰的类本身也有元类操作时就出错了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1005652

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX