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

时间:2013-12-04 10:21:35

标签: python class oop instance

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

  • 这是我的正确方法吗?请注意,我不想创建EventManager的多个实例,因为它在每次调用时都会解析文件,并且该文件可能包含大量数据。
  • 考虑到我希望减少内存使用量,最好的方法是什么?

2 个答案:

答案 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

通常,使用元类来实现 单身人士。单例很特殊,因为它只会创建一次,而 元类是自定义类创建的方式。用一个 万一您需要自定义 其他方式的单例类定义。