我有一些在我的 Python 应用程序中广泛使用的类,它们应该只有一个全局实例(例如 Logger、DbConnection)。Python 不支持类中的静态变量/方法,因此在这里创建单例的常用 Java/C++ 方法不起作用。我一直在寻找在 Python 中实现单例的替代方案。我想要一个简单的(如果可能的话不要元编程)和干净的实现。这看起来不错:
class MyClass(object):
def a():
pass
singleton = MyClass()
使用单例很简单
import myClass
myClass.singleton.a()
如果对象初始化不是那么简单,直接赋值可以用创建函数代替。
我还可以在模块范围内创建一个 getInstance() 并始终使用它来获取 myObj。
问题1)这行得通吗?模块代码(myObj 分配)仅在第一次导入其他模块时运行,并且每次我在某处导入此模块时都不会创建 myObj?
我见过的另一种方法是使用 globals 模块。就像是:
from myClass1 import MyClass1
from myClass2 import MyClass2
myObj1 = MyClass1()
myObj2 = MyClass2()
使用这个:
import globals
globals.myObj1.a()
我倾向于更喜欢第一种选择。
问题 2)在 2 个解决方案之间,您有什么建议?
问题 3)第三种解决方案是将广泛的对象(例如 Logger)传递给多个类/函数,但这不是一个好的解决方案恕我直言。这里没有提到更好的解决方案吗?
我知道使用全局变量和单例的缺点。但是,在我的应用程序中,拥有一个全局状态并不是一个大问题。我更喜欢代码清晰且易于使用的解决方案。