Python套接字实现

斯特菲尔

我是python的新手,但是我来自C的高深背景,但是我试图弄清楚它是如何工作的:如何在urllib2中使用SOCKS 4/5代理?

我难以理解的部分是它们被覆盖,socket.socket但仍然socket.socket是运行所告知的“类型” type(socket.socket)因此,我对您如何覆盖这样的类型感到困惑,或者socket.socket在这种情况下,它们实际上是他们正在重新定义的函数,因此实际上返回了另一个类型?通常,如果我type在某个函数上运行,它将返回该函数或方法或其他内容。

我想我真正想了解的是幕后到底发生了什么?

雷蒙德·海廷格(Raymond Hettinger)

我想我真正想了解的是幕后到底发生了什么?

这是一个很好的问题。

在这样的另一个命名空间中存储变量称为“猴子补丁”

该代码示例实际上并未覆盖类型而是,它更新套接字模块名称空间中套接字变量以指向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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章