我对python相当陌生,但是我来自强大的C背景,我试图弄清楚这是如何工作的:我如何使用SOCKS 4/5代理与urllib2?
我难以理解的部分是它们覆盖socket.socket
,但socket.socket
是运行type(socket.socket)
所告诉的"类型"。所以我很困惑你是如何重写这样一个类型的,或者socket.socket
在这种情况下实际上是一个函数,他们重新定义,因此实际上返回一个不同的类型?通常如果我在一个函数上运行type
它会返回它是一个函数或者一个方法。
我想我真正想了解的是在被子下面发生了什么?
我想我真正想了解的是在被子下面发生了什么?
这个问题问得好。
像这样在另一个命名空间中存储变量称为"monkey patchching"。
代码示例实际上并没有覆盖类型。相反,它更新socket模块命名空间中的socket变量,以指向一个socks 4/5类。然后,当urllib2查找套接字时。变量,它现在使用SocksiPy模块而不是本地套接字。 重要的是要知道套接字。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
这里是一个简单的猴子补丁示例,用于math模块:
>>> import math
>>> def area(radius):
return math.pi * radius ** 2.0
>>> math.pi = 3.1 # monkey patch
>>> area(10)
310.0
考虑以下
class SomeClass:
def __init__(self):
print "I am some class!"
class SomeOtherClass:
def __init__(self):
print "I am some other class!!"
c1 = SomeClass()
c2 = SomeOtherClass()
SomeClass = SomeOtherClass #shadows the other class
c3 = SomeClass()
这只是发生在模块级socket