gpt4 book ai didi

Python:将模块及其变量视为单例——干净的方法?

转载 作者:IT老高 更新时间:2023-10-28 22:00:59 26 4
gpt4 key购买 nike

我想在我的 Python 程序中实现某种单例模式。我想在不使用类的情况下这样做;也就是说,我想将所有与单例相关的函数和变量放在一个模块中,并认为它是一个真正的单例。

例如,假设这是在文件'singleton_module.py'中:

# singleton_module.py

# Singleton-related variables
foo = 'blah'
bar = 'stuff'

# Functions that process the above variables
def work(some_parameter):
global foo, bar
if some_parameter:
bar = ...
else:
foo = ...

然后,程序的其余部分(即其他模块)将像这样使用这个单例:

# another_module.py

import singleton_module

# process the singleton variables,
# which changes them across the entire program
singleton_module.work(...)

# freely access the singleton variables
# (at least for reading)
print singleton_module.foo

这对我来说似乎是个好主意,因为它在使用单例的模块中看起来非常干净。

然而,单例模块中所有这些乏味的“全局”语句都很丑陋。它们出现在处理单例相关变量的每个函数中。在这个特定的示例中,这并不算多,但是当您有 10 多个变量要跨多个函数进行管理时,它就不漂亮了。

此外,如果您碰巧忘记了全局语句,这很容易出错:将创建函数的本地变量,并且不会更改模块的变量,这不是您想要的!

那么,这会被认为是干净的吗?有没有类似于我的方法可以消除“全局”困惑?

或者这根本就不是要走的路?

最佳答案

使用模块作为单例的常见替代方法是 Alex Martelli 的 Borg pattern :

class Borg:
__shared_state = {}
def __init__(self):
self.__dict__ = self.__shared_state
# and whatever else you want in your class -- that's all!

这个类可以有多个实例,但它们都共享相同的状态。

关于Python:将模块及其变量视为单例——干净的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6255050/

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