我是python的新手,但是我来自C的高深背景,但是我试图弄清楚它是如何工作的:如何在urllib2中使用SOCKS 4/5代理?
我难以理解的部分是它们被覆盖,socket.socket
但仍然socket.socket
是运行所告知的“类型” type(socket.socket)
。因此,我对您如何覆盖这样的类型感到困惑,或者socket.socket
在这种情况下,它们实际上是他们正在重新定义的函数,因此实际上返回了另一个类型?通常,如果我type
在某个函数上运行,它将返回该函数或方法或其他内容。
我想我真正想了解的是幕后到底发生了什么?
我想我真正想了解的是幕后到底发生了什么?
这是一个很好的问题。
在这样的另一个命名空间中存储变量称为“猴子补丁”。
该代码示例实际上并未覆盖类型。而是,它更新套接字模块名称空间中的套接字变量以指向socks 4/5类。然后,当urllib2查找socket.socket变量时,它现在使用SocksiPy模块而不是本机套接字。
要知道的重要事项是socket.socket是一个变量,最初设置为指向内置套接字类型。可以更新该变量以指向新的4/5套接字类型。当urllib2查找变量时,它将使用替代项而不是原始变量。
从概念上讲,正在发生的事情大致与此相似:
>>> socket = 'old_native_socket'
>>> def urllib2(url):
return 'Looking up', url, 'using', socket
>>> socket = 'new_4_5_socket'
>>> urllib2('http://www.python.org')
Looking up http://www.python.org using new_4_5_socket
这是数学模块的简单猴子补丁示例:
>>> import math
>>> def area(radius):
return math.pi * radius ** 2.0
>>> math.pi = 3.1 # monkey patch
>>> area(10)
310.0
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句