模版如下:
class Singleton:
__instance = None
def __new__(cls, *args):
if cls.__instance is None:
cls.__instance = object.__new__(cls, *args)
return cls.__instance
1
vicalloy 324 天前 3
我一直没明白为啥这么多人不遗余力的在 Python 里给出各种不同的单例子实现方法。
对于 Python 来说最简单的单例不应当就是这样吗 singleton = Singleton() 或者你想要 lazy _singleton: Singleton = None def get_singleton(): global _singleton if _singleton is None: _singleton = Singleton() return _singleton |
2
fcfangcc 324 天前
赞同 1 楼,全局变量一把梭
|
3
QiShine 324 天前
OOP 都快成了一种邪教
|
4
wzwwzw 324 天前
可以比一楼 在优雅一点,把放到 TLS 里面可以了。
```python import threading _tls - threading.local() def get_singleton(): if not hasattr(_tls, 'single'): _tls.single = Singleton() return _tls.single ``` |
6
vicalloy 324 天前
另外 Java 里的单例构造函数是私有的,你只能通过特定的方法来获取实例,这样你会明确的知道这个类是单例。
对于大多 Python 里的单例,用的地方都 Singleton() 这么来一下。除了看文档,或是在类的名字上加个 Singleton ,根本就没法知道这个类是单例。 |
8
CHchenkeyi 324 天前
在 A 文件中创建对象,并在其他文件引入
|
9
lolizeppelin 323 天前
用元类装饰器
```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(): .... ``` 写一个通用的非常方便 缺点时候被装饰的类本身也有元类操作时就出错了 |