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

 mobiledu2502916573 发布于 2023-02-12 21:52

我有一个名为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]

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

1 个回答
  • 单身就是你需要的.这是一个简单的例子.请注意,如果您在其他模块中导入和使用单例,那么一切仍然可以正常工作(这就是重点).

    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]
    

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

    2023-02-12 22:00 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有