Python套接字实现

Python套接字实现,python,sockets,namespaces,global-variables,monkeypatching,Python,Sockets,Namespaces,Global Variables,Monkeypatching,我对python相当陌生,但是我有很强的C语言背景,我试图弄清楚这是如何工作的: 我很难理解的是,它们覆盖了socket.socket,但是socket.socket是一个“类型”,正如运行type(socket.socket)所告诉的那样。所以我很困惑,你怎么能够覆盖这样的类型,或者是socket.socket,在这种情况下,实际上是一个他们正在重新定义的函数,因此实际上返回了一个不同的类型?通常,如果我对一个函数运行type,它会返回它是一个函数、一个方法或其他什么 我想我真正想了解的是在幕

我对python相当陌生,但是我有很强的C语言背景,我试图弄清楚这是如何工作的:

我很难理解的是,它们覆盖了
socket.socket
,但是
socket.socket
是一个“类型”,正如运行
type(socket.socket)
所告诉的那样。所以我很困惑,你怎么能够覆盖这样的类型,或者是
socket.socket
,在这种情况下,实际上是一个他们正在重新定义的函数,因此实际上返回了一个不同的类型?通常,如果我对一个函数运行
type
,它会返回它是一个函数、一个方法或其他什么

我想我真正想了解的是在幕后发生了什么

我想我真正想了解的是在幕后发生了什么

这是一个很好的问题

将一个变量存储在另一个名称空间中(类似这样)称为

代码示例实际上并没有覆盖该类型。相反,它更新socket模块命名空间中的socket变量以指向socks 4/5类。然后,当urllib2查找socket.socket变量时,它现在使用而不是本机套接字

要知道的重要一点是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
下面是模块的一个简单猴子补丁示例:

考虑以下几点

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

你也可以做一些事情,比如
sys.stdout=my_log_file
,这对我来说很有意义,因为stdout只是一个指向文件的变量,但是socket.socket说它是一种类型我不理解socket.socket实际上是一个变量,因为它不应该返回一个套接字类型而不仅仅是类型吗?你正在跟踪这个类。。。在模块级,类只是变量……很有趣。我已经习惯了C语言,一旦一个类型被设置好,它就被固定在石头上,这对我来说打破了所有的惯例。我没有意识到这在python中是可能的
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()