当前位置: 首页 > news >正文

如何避免类重复导入

针对这种情况,有几种解决方案可以避免重复初始化类A。以下是推荐的方法:

1. 使用单例模式 (Singleton Pattern)

python

# class_a.py
class A:_instance = None_initialized = Falsedef __new__(cls, *args, **kwargs):if cls._instance is None:cls._instance = super().__new__(cls)return cls._instancedef __init__(self, config=None):# 防止重复初始化if not self._initialized:self.config = config or {}self._setup_resources()self._initialized = Trueprint("A 类初始化完成")def _setup_resources(self):# 初始化资源代码self.resources = {"db": "connected", "cache": "ready"}def do_work(self):return f"Working with config: {self.config}"# main.py
from class_a import Adef initialize_application():# 主程序初始化app = A(config={"env": "production", "debug": False})return appif __name__ == "__main__":# 主程序启动时初始化main_app = initialize_application()print("应用程序启动完成")# other_file.py
from class_a import Adef some_function():# 这里不会重新初始化,会返回已存在的实例existing_app = A()  # 不会触发重复初始化return existing_app.do_work()

2. 模块级单例实例

python

# class_a.py
class A:def __init__(self, config=None):self.config = config or {}self._setup_resources()print("A 类初始化完成")def _setup_resources(self):self.resources = {"db": "connected", "cache": "ready"}def do_work(self):return f"Working with config: {self.config}"# 在模块级别创建实例
_global_instance = Nonedef get_a_instance(config=None):global _global_instanceif _global_instance is None and config is not None:_global_instance = A(config)elif _global_instance is None:raise RuntimeError("A 类尚未初始化,请先提供配置参数")return _global_instancedef initialize_a(config):global _global_instanceif _global_instance is not None:raise RuntimeError("A 类已经初始化过了")_global_instance = A(config)return _global_instance# main.py
from class_a import initialize_adef main():# 主程序初始化app = initialize_a(config={"env": "production"})print("应用程序启动完成")if __name__ == "__main__":main()# other_file.py
from class_a import get_a_instancedef some_function():# 获取已初始化的实例app = get_a_instance()return app.do_work()

3. 使用依赖注入容器

python

# dependency_container.py
class DependencyContainer:def __init__(self):self._dependencies = {}def register(self, name, instance):if name in self._dependencies:raise RuntimeError(f"{name} 已经注册")self._dependencies[name] = instancedef get(self, name):if name not in self._dependencies:raise RuntimeError(f"{name} 未注册")return self._dependencies[name]# 全局依赖容器
container = DependencyContainer()# class_a.py
class A:def __init__(self, config=None):self.config = config or {}self._setup_resources()print("A 类初始化完成")def _setup_resources(self):self.resources = {"db": "connected", "cache": "ready"}def do_work(self):return f"Working with config: {self.config}"# main.py
from class_a import A
from dependency_container import containerdef initialize_application():# 初始化并注册到容器app = A(config={"env": "production"})container.register('app', app)print("应用程序启动完成")if __name__ == "__main__":initialize_application()# other_file.py
from dependency_container import containerdef some_function():# 从容器获取实例app = container.get('app')return app.do_work()

4. 使用类方法控制初始化

python

# class_a.py
class A:_instance = Nonedef __init__(self, config):self.config = configself._setup_resources()print("A 类初始化完成")@classmethoddef initialize(cls, config):if cls._instance is not None:raise RuntimeError("A 类已经初始化过了")cls._instance = cls(config)return cls._instance@classmethoddef get_instance(cls):if cls._instance is None:raise RuntimeError("A 类尚未初始化")return cls._instancedef _setup_resources(self):self.resources = {"db": "connected", "cache": "ready"}def do_work(self):return f"Working with config: {self.config}"# main.py
from class_a import Adef main():# 主程序初始化app = A.initialize(config={"env": "production"})print("应用程序启动完成")if __name__ == "__main__":main()# other_file.py
from class_a import Adef some_function():# 获取已初始化的实例app = A.get_instance()return app.do_work()

5. 最简单的方案 - 全局实例导入

python

# class_a.py
class A:def __init__(self, config):self.config = configself._setup_resources()print("A 类初始化完成")def _setup_resources(self):self.resources = {"db": "connected", "cache": "ready"}def do_work(self):return f"Working with config: {self.config}"# 全局实例
app_instance = Nonedef init_global_a(config):global app_instanceif app_instance is not None:raise RuntimeError("A 实例已经存在")app_instance = A(config)# main.py
from class_a import init_global_adef main():# 主程序初始化全局实例init_global_a(config={"env": "production"})print("应用程序启动完成")if __name__ == "__main__":main()# other_file.py
from class_a import app_instancedef some_function():# 直接使用全局实例if app_instance is None:raise RuntimeError("应用程序未初始化")return app_instance.do_work()

推荐方案

对于你的场景,我推荐使用 方案2(模块级单例实例) 或 方案4(类方法控制初始化),因为:

  1. 明确初始化流程 - 强制要求在主程序中先初始化

  2. 防止误用 - 其他文件无法重新初始化

  3. 代码清晰 - 意图明确,易于维护

  4. 线程安全 - 在单线程环境下安全

选择哪个方案取决于你的具体架构偏好。方案2更函数式,方案4更面向对象。

http://www.dtcms.com/a/488305.html

相关文章:

  • CC2-后缀表达式求值
  • 北京住房和城乡建设厅网站六安市网站建设
  • 河北网站开发多少钱广州移动网站开发
  • 深入理解 malloc:ptmalloc 机制、堆布局与内核映射
  • 湖南网站建设360o重庆所有做网站的公司有哪些
  • 使用 Gorm 框架连接达梦数据库实战指南
  • 大模型—AIGC应用:基于RAG构建个人知识库
  • VSCode高效使用完全指南:提升开发效率的系统化实践
  • anaconda vscode python 安装配置
  • c2c模式流程图枣庄seo推广
  • 从冷call到暖聊:AI情感电销革命
  • 织梦cms如何做网站丹阳网站建设制作
  • 合肥做网站专家网页设计心得体会600
  • 成都医院手机网站建设私人架设服务器
  • 网站开发教程图文石家庄又封了
  • point-transformer模型tensorrt推理部署
  • 用PDH库获取CPU使用率(源码)
  • 展示型网站一样做seo优化吗华为云建站和阿里云建站区别
  • 《扫雷:病毒蔓延》- 颠覆传统的动态扫雷游戏
  • phpwind做的网站wordpress 双分页
  • 西宁网站制作公司专业wordpress主题开发
  • 前端与后端开发详解:从概念到就业技能指南_前后端开发
  • Java业务异常处理最佳实践
  • 电子商务网站开发教程课后答案做公众号策划的网站
  • 小程序自助建站wordpress您的密码重设链接无效
  • 龙华网站建设主要工作广东省住房和城乡建设局网站
  • 建设企业网站得花多少钱成都 网站开发公司
  • 深圳制作企业网站的公司网站项目策划书模板
  • 为什么要尽量将MySQL表字段要设置为NOT NULL?
  • 数据结构与算法(递归)