Python socket implementation



我对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

相关内容

  • 没有找到相关文章

最新更新