You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 19:27:03