我有一个名为EventManager的类,我在每个模块中调用这个类.我想到在主文件中创建一个EventManager的实例,并在每个模块中使用该实例.我的问题是:
这是我的正确方法吗?请注意,我不想创建EventManager的多个实例,因为它在每次调用时都会解析文件,并且该文件可能包含大量数据.
考虑到我想减少内存使用量,最好的方法是什么?
Vincent.. 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
您需要了解的是,EventManager将在类定义之后立即实例化,这意味着第一次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]
它有效,但正如我所说,我不认为它有用.您也可以使用方法或模块变量来初始化您的单例.
单身就是你需要的.这是一个简单的例子.请注意,如果您在其他模块中导入和使用单例,那么一切仍然可以正常工作(这就是重点).
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
您需要了解的是,EventManager将在类定义之后立即实例化,这意味着第一次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]
它有效,但正如我所说,我不认为它有用.您也可以使用方法或模块变量来初始化您的单例.