我有几个在我的Python应用程序中普遍存在并且应该只有一个全局实例(例如Logger,DbConnection)的类。 Python不支持类中的静态变量/方法,因此在这里创建单例的常用Java/C++方式不起作用。我已经寻找了在Python中实现单例的替代方案。我想要一个简单的(如果可能的话,不要编程)和干净的实现。这看起来很不错:Python中的全局变量和单例
class MyClass(object):
def a():
pass
singleton = MyClass()
使用Singleton是简单
import myClass
myClass.singleton.a()
直接分配可以由创建功能所取代,如果对象的初始化并非如此简单。
我也可以在模块范围内创建一个getInstance(),并始终使用它来获取myObj。
问题1)这工作正常吗?模块代码(myObj赋值)仅在第一次将其导入其他模块时运行,并且每次将该模块导入某处时都不会创建myObj?
我看到的另一种方法是使用全局模块。喜欢的东西:
from myClass1 import MyClass1
from myClass2 import MyClass2
myObj1 = MyClass1()
myObj2 = MyClass2()
使用此:
import globals
globals.myObj1.a()
我倾向于选择第一种选择。
问题2)在两种解决方案之间,你有什么建议?
问题3)第三种解决方案是将诸如Logger等广泛的对象传递给几个类/函数,但这不是一个好的解决方案。有没有更好的解决方案在这里没有提到?
我知道使用全局变量和单例的缺点。但是,拥有一个全球性的国家在我的申请中并不是一个大问题。我更喜欢代码清晰且易于使用的解决方案。
你问题的前提是错误的。首先,python支持静态方法和变量。其次,为什么不使用现有的标准库进行日志记录和数据库访问? –
Python直接支持静态方法/变量(没有注释破解)?你的第二个问题偏离了这个问题(单例实现),用任何一个单例类代替logging/db访问类,并且它在应用程序中被广泛使用。 –