首页 > 解决方案 > 如何在类中设置一次变量

问题描述

我目前正在处理一个小项目,我已经完成了代理转换器格式以及正在使用的代理的可用性。

目前我最终做了这样的事情:

import random
import threading
import time
from typing import Dict

from loguru import logger


class ProxyManager(object):
    def __init__(self, proxy_file_path=None):
        self.proxies = self.load_proxies(proxy_file_path) if proxy_file_path else {}

    @staticmethod
    def load_proxies(proxy_file_path):
        with open(proxy_file_path) as proxy_file:
            proxies = {'https': [], 'http': []}
            for proxy in proxy_file.readlines():
                if proxy.count(':') > 1:
                    ip, port, username, password = proxy.rstrip().split(':')
                    url = f'http://{ip}:{port}:{username}@{password}'
                else:
                    ip, port = proxy.rstrip().split(':')
                    url = f'http://{ip}:{port}'
                proxies['https'].append(url)

            return proxies

    def random_proxy_https(self):
        return random.choice(self.proxies['https'])

    def all_proxies_https(self):
        return [proxy for proxy in self.proxies['https']]


# -------------------------------------------------------------------------
# Proxies path
# -------------------------------------------------------------------------
proxies: Dict[str, ProxyManager] = {
    "rotating": ProxyManager("./proxies/rotating.txt"),
    "test": ProxyManager("./proxies/test.txt")
}

# -------------------------------------------------------------------------
# Proxies available
# -------------------------------------------------------------------------
all_proxies = proxies["rotating"].all_proxies_https()
proxy_dict = dict(zip(all_proxies, ['available'] * len(all_proxies)))

proxy_lock: threading = threading.Lock()


# -------------------------------------------------------------------------
# Initialize availability of proxies
# -------------------------------------------------------------------------
class AvailableProxies:
    def __enter__(self):
        proxy_lock.acquire()
        self.proxy = None

        while not self.proxy:
            available = [
                att for att, value in proxy_dict.items() if "available" in value
            ]
            if available:
                self.proxy = random.choice(available)
                proxy_dict[self.proxy] = "busy"
                break
            else:
                logger.info("Waiting ... no proxies available")
                time.sleep(.2)

        proxy_lock.release()
        return self.proxy

    def __exit__(self, exc_type, exc_val, exc_tb):
        proxy_dict[self.proxy] = "available"

这个想法是我将有多个脚本需要 ProxyManager 类但不需要AvailableProxies- 这意味着我不需要设置变量

# -------------------------------------------------------------------------
# Proxies available
# -------------------------------------------------------------------------
all_proxies = proxies["rotating"].all_proxies_https()
proxy_dict = dict(zip(all_proxies, ['available'] * len(all_proxies)))

proxy_lock: threading = threading.Lock()

如果特定脚本不需要该类。我想知道是否可以在类中设置变量,并且当我们将变量导入脚本时AvailableProxies,变量all_proxies, proxy_dict & proxy_lock应该只在类中设置一次?AvailableProxies

标签: python-3.xclassvariables

解决方案


推荐阅读