首先定义一个类,作用是获取代理
class Proxies:
def __init__(self):
self.bin_file = Path(__name__).resolve().parent / 'deque.bin'
if self.bin_file.exists():
with open(self.bin_file.as_posix(), 'rb') as fpr:
self.qproxy = pickle.load(fpr)
print('deque loaded')
else:
self.qproxy = deque()
print('deque created')
self.get_ip = "API"
self.get_proxies()
def __del__(self):
with open(self.bin_file.as_posix(), 'wb') as fpw:
pickle.dump(self.qproxy, fpw)
print('deque dumped')
def get_proxies(self):
logging.info("Getting proxies from API.")
with HTMLSession() as ip_session:
with ip_session.get(self.get_ip) as resp_ip:
resp_ip2 = resp_ip.text.split('\r\n')
proxies_http = [{"http": "http://{}".format(i), "cd": 3
} for i in resp_ip2 if i is not None]
proxies_https = [{"https": "https://{}".format(i), "cd": 3
} for i in resp_ip2 if i is not None]
[self.put(p) for p in proxies_http]
[self.put(ps) for ps in proxies_https]
logging.info("Proxies get.")
def get(self):
if len(self.qproxy) <= 1:
self.get_proxies()
return self.qproxy.popleft()
def put(self, p):
self.qproxy.append(p)
return None
@property
def size(self):
return len(self.qproxy)
在此之前我已经创建一个实例 p = Proxies() 然后打印出了 deque created 没说明 bin 文件已经被创建,创建后实例获取了 40 个代理 然后执行 del p 然而此时 deque dumped 没有被打印出来,也就是析构函数没有被执行
然后从新创建一个实例 p = Proxies() 输出 deque loaded deque dumped
deque dumped 在此时打印了出来,这是为什么? 此时 p.size 为 40,这是正确的
然后手动获取代理 p.get_proxies() 输出 deque dumped 此时为什么又输出了析构函数中的 print ?
p.size 输出 80,这个也是正确的
del p 输出 deque dumped 此时析构函数又正常执行了。。。。
python 版本 3.7
谁能给分析分析是为什么吗
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.