如何在Python类中实现导入时仅一次性初始化所需变量
解决方案
完全可以实现你的需求,把这三个变量作为AvailableProxies的类属性即可,类属性只会在类首次被导入加载的时候初始化一次,没有用到这个类的脚本不会触发这部分初始化逻辑。
修改后代码示例
保留原有的ProxyManager和全局代理路径配置,仅修改AvailableProxies部分代码即可:
# ------------------------------------------------------------------------- # 代理可用性管理类 # ------------------------------------------------------------------------- class AvailableProxies: # 类属性,仅在类首次被导入时初始化一次 all_proxies = proxies["rotating"].all_proxies_https() proxy_dict = dict(zip(all_proxies, ['available'] * len(all_proxies))) proxy_lock = threading.Lock() def __enter__(self): # 引用类属性 self.__class__.proxy_lock.acquire() self.proxy = None while not self.proxy: available = [ att for att, value in self.__class__.proxy_dict.items() if "available" in value ] if available: self.proxy = random.choice(available) self.__class__.proxy_dict[self.proxy] = "busy" break else: logger.info("等待中...无可用代理") time.sleep(.2) self.__class__.proxy_lock.release() return self.proxy def __exit__(self, exc_type, exc_val, exc_tb): self.__class__.proxy_dict[self.proxy] = "available"
逻辑说明
- 类属性会在Python解释器第一次读取到
AvailableProxies类定义时完成初始化,如果你编写的脚本只导入ProxyManager使用,完全不涉及AvailableProxies的导入和调用,这三个变量永远不会被创建,不会占用额外资源。 - 上述写法和你原有逻辑完全兼容,不需要调整使用方式。如果需要灵活切换代理源,可以额外增加类方法做动态初始化即可。
使用示例
需要使用代理可用性管理的脚本里,正常导入后和之前用法完全一致:
# 只有导入AvailableProxies的时候才会触发类属性初始化 from your_module_name import AvailableProxies with AvailableProxies() as proxy: # 此处使用proxy执行网络请求即可 print(f"当前使用代理: {proxy}")
内容的提问来源于stack exchange,提问作者PythonNewbie
相关产品推荐
相关产品推荐

