gpt4 book ai didi

python - Python 中的全局变量和单例

转载 作者:太空狗 更新时间:2023-10-30 00:07:57 26 4
gpt4 key购买 nike

我有一些在我的 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?

我见过的另一种方法是使用全局模块。像这样的东西:

from myClass1 import MyClass1
from myClass2 import MyClass2

myObj1 = MyClass1()
myObj2 = MyClass2()

使用这个:

import globals
globals.myObj1.a()

我倾向于第一种选择。

问题 2) 在这两种解决方案中,您推荐什么?

问题 3) 第三种解决方案是将广泛使用的对象(例如 Logger)传递给多个类/函数,但这不是一个好的解决方案恕我直言。有没有这里没有提到的更好的解决方案?

我知道使用全局变量和单例的缺点。但是,在我的应用程序中,拥有全局状态并不是一个大问题。我更喜欢代码清晰且易于使用的解决方案。

最佳答案

如果您想要一个只有一个实例的 logger 类,只需将其作为一个单独的模块即可。

# In logging.py
def log(msg):
print msg

然后从您想要登录的任何脚本。

from logging import log
log("A critical error occured.")

关于python - Python 中的全局变量和单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12066180/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com