python-3.x - 如何在类中设置一次变量
问题描述
我目前正在处理一个小项目,我已经完成了代理转换器格式以及正在使用的代理的可用性。
目前我最终做了这样的事情:
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
解决方案
推荐阅读
- excel - Jet.OLEDB 或 ACE.OLEDB MS Access
- ubuntu - 在 Ubuntu 16.04 上安装并运行 Tomcat 8 错误
- ffmpeg - 增加多个文件的音量
- php - Symfony & Doctrine 打破了表格
- javascript - Canvg - 使用缩放时 SVG 溢出
- c# - 如何禁用 Word 样式上下文菜单中的某些选项
- javascript - VueJS - 在 Vue 组件中循环遍历列表会生成空列表
- scala - 检查推文数组的元素是否包含正词数组和计数的元素之一
- c# - 使用 UnityWebRequest 上传大文件
- c++ - LibVLC 3.x 如何打开由 SDP 文件或包含凭据的流描述的流