代码重构:如何避免Network对象重复实例化?
解决Network对象重复实例化的问题
方案一:通过config.py集中管理实例(你提到的方法完全可行)
这是最直观且易维护的方案,利用Python模块的单例加载特性(模块只会被解释器执行一次),将Network实例统一放在单独的配置文件中,其他模块直接导入使用即可:
- 新建
config.py文件,在这里完成唯一一次Network实例化:
# config.py # 假设Network类定义在network.py中,根据实际路径调整导入 from network import Network # 全局唯一的Network实例 network_instance = Network()
- 修改
order.py,删除自身的Network实例化代码,改为从config导入:
# order.py from config import network_instance # 后续直接使用network_instance即可,比如: # network_instance.send_request(...)
- 修改
shop.py,同样导入config中的实例,原有的order.py导入逻辑不受影响:
# shop.py from config import network_instance from order import process_order # 按需导入order中的功能,无需再实例化Network # 使用network_instance处理业务逻辑
这样不管order.py和shop.py如何互相导入,network_instance只会被创建一次,"Network object created"只会打印一次。
方案二:给Network类实现单例模式
如果不想新增config文件,也可以直接修改Network类,让它本身保证全局只有一个实例:
# network.py class Network: _instance = None _initialized = False def __new__(cls, *args, **kwargs): if not cls._instance: cls._instance = super().__new__(cls, *args, **kwargs) return cls._instance def __init__(self): # 确保初始化逻辑只执行一次 if not self._initialized: print("Network object created") # 这里添加其他初始化代码,比如连接配置等 self._initialized = True
之后不管你在order.py还是shop.py中调用Network(),都会得到同一个实例,初始化信息只会打印一次。
方案对比
- 用config.py的方式更清晰,把实例的创建和使用分离,便于后续统一修改实例的创建逻辑(比如添加参数)。
- 单例类的方式更适合需要在多处调用
Network()但又要保证唯一实例的场景,对原有代码的改动更小(只需修改Network类,其他文件的实例化代码可以保留)。
内容的提问来源于stack exchange,提问作者Mahan Marwat
相关产品推荐
相关产品推荐

