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