Python:在多个模块中使用相同的类实例

问题描述 投票:4回答:1

我有一个名为EventManager的类,我在每个模块中调用这个类。我想到在主文件中创建一个EventManager的实例,并在每个模块中使用该实例。我的问题是:

  • 这是我的正确方法吗?请注意,我不想创建EventManager的多个实例,因为它在每次调用时都会解析文件,并且该文件可能包含大量数据。
  • 考虑到我想减少内存使用量,最好的方法是什么?
python class oop instance
1个回答
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]

它有效,但正如我所说,我不认为它有用。您也可以使用方法或模块变量来初始化您的单例。

© www.soinside.com 2019 - 2024. All rights reserved.