为什么我们不能只创建静态方法和属性以在项目中全局使用?仅使用类属性而不使用任何对象属性也不会成为单例模式的一部分,这样使用它会有什么问题吗?它仅适用于单元测试等我们需要自定义构造函数的情况? 示例:
class GlobalInfo:
_global_data = {}
_lock = threading.Lock()
@staticmethod
def set_data(key, value):
with GlobalInfo._lock:
GlobalInfo._global_data[key] = value
@staticmethod
def get_data(key):
with GlobalInfo._lock:
return GlobalInfo._global_data.get(key)
我需要一种具有类似单例行为的东西,以便在多个线程需要访问相同信息的项目中使用。读了一下之后,我发现人们总是重写 new 方法等。我想知道我是否真的需要这样做,如果不需要,对于我的具体情况,我是否会违反单例模式?
不,大多数情况下没有必要,你是对的。
然而,在某些情况下,单例需要在运行时初始化 - 也许是为了在 Python 代码中提供某些配置参数的效果,或者创建一些其他进程范围的资源。
在这种情况下,这些食谱是有效 - 但不是需要。
每当我需要这样的单例时(通常,我更喜欢将方法标记为静态,即使不需要初始化),我最喜欢的模式是简单地在模块级别创建单例类的实例 - 这样实例将是通过项目导入和使用的对象(而不是其类)。
就像:
class _MyConf:
def __init__(self):
# code that sets some attributes to be used process-wide
def method(self):
# plain instance method
...
MyConf = _MyConf()
随后记录应使用
MyConf
。