我有一个名为EventManager的类,我在每个模块中调用此类。我想到在主文件中创建一个EventManager的实例,并在每个模块中使用该实例。我的问题是:
答案 0 :(得分:8)
你可以使用单身人士。这是一个简单的例子:
def singleton(cls):
return cls()
@singleton
class EventManager:
def __init__(self):
self.events = []
def add_event(self, event):
self.events.append(event)
def print_events(self):
print("Events : {}".format(self.events))
EventManager.add_event(0)
EventManager.add_event(1)
EventManager.add_event(2)
EventManager.print_events()
输出:
Events : [0, 1, 2]
请注意,在导入单例并在其他模块中使用时,一切仍然按预期工作。
修改强>
你问:
问题是我使用像EventManager(var)之类的变量初始化类,在这种情况下我该怎么做?
该类将在其定义后立即实例化,即第一次导入包含EventManager
的模块。由于EventManager
是一个单例,我认为用一个变量初始化单例是不合适的。尽管有可能:
def singleton_with_args(*args, **kwargs):
def wrapper(cls):
return cls(*args, **kwargs)
return wrapper
@singleton_with_args(0)
class EventManager:
def __init__(self, first_event):
self.events = [first_event]
def add_event(self, event):
self.events.append(event)
def print_events(self):
print("Events : {}".format(self.events))
EventManager.add_event(1)
EventManager.add_event(2)
EventManager.add_event(3)
EventManager.print_events()
输出:
Events : [0, 1, 2, 3]
它有效,但正如我所说,我不认为它有用。您也可以使用方法或模块变量来初始化单例。
答案 1 :(得分:0)
这个问题很老,但这是第一个出现在我身上的问题,所以我认为对于其他人来说,有很多关于单例是反模式而不是pythonic等话题的讨论。
搜索了一段时间后,我认为最好的方法是使用metaclass:
通常,使用元类来实现 单身人士。单例很特殊,因为它只会创建一次,而 元类是自定义类创建的方式。用一个 万一您需要自定义 其他方式的单例类定义。