代码之家  ›  专栏  ›  技术社区  ›  Luka Rahne

无法重载python socket.send

  •  5
  • Luka Rahne  · 技术社区  · 14 年前

    正如我们所看到的,send方法不是重载的。

    from socket import socket
    
    class PolySocket(socket):
    
        def __init__(self,*p):
            print "PolySocket init"
            socket.__init__(self,*p)
    
        def sendall(self,*p):
            print "PolySocket sendall"
            return socket.sendall(self,*p)
    
        def send(self,*p):
            print "PolySocket send"
            return socket.send(self,*p)
    
    
        def connect(self,*p):
            print "connecting..."
            socket.connect(self,*p)
            print "connected"
    
    HOST="stackoverflow.com"   
    PORT=80
    readbuffer=""
    
    s=PolySocket()
    s.connect((HOST, PORT))
    s.send("a")
    s.sendall("a")
    

    输出:

    PolySocket init
    connecting...
    connected
    PolySocket sendall
    
    1 回复  |  直到 10 年前
        1
  •  9
  •   kmerenkov    14 年前

    我确信您实际上并不需要它,而且还有其他方法来解决您的任务(不是子类化,而是真正的任务)。

    如果您确实需要模拟对象,请使用代理对象:

    from socket import socket
    
    
    class PolySocket(object):
        def __init__(self, *p):
            print "PolySocket init"
            self._sock = socket(*p)
    
        def __getattr__(self, name):
            return getattr(self._sock, name)
    
        def sendall(self, *p):
            print "PolySocket sendall"
            return self._sock.sendall(*p)
    
        def send(self, *p):
            print "PolySocket send"
            return self._sock.send(*p)
    
        def connect(self, *p):
            print "connecting..."
            self._sock.connect(*p)
            print "connected"
    
    HOST = "stackoverflow.com"
    PORT = 80
    readbuffer = ""
    
    s = PolySocket()
    s.connect((HOST, PORT))
    s.send("a")
    s.sendall("a")
    

    输出结果如下:

    % python foo.py
    PolySocket init
    connecting...
    connected
    PolySocket send
    PolySocket sendall