为了方便起见,我想将socket子类化以创建一个ICMP套接字:

class ICMPSocket(socket.socket):
    def __init__(self):
        socket.socket.__init__(
            self,
            socket.AF_INET,
            socket.SOCK_RAW,
            socket.getprotobyname("icmp"))

    def sendto(self, data, host):
        socket.socket.sendto(self, data, (host, 1))

但是,我无法覆盖socket.sendto:
>>> s = icmp.ICMPSocket()
>>> s.sendto
<built-in method sendto of _socket.socket object at 0x100587f00>

这是因为sendto是“内置方法”。根据data model reference的说法,“这实际上是内置函数的另一种伪装,这次包含一个作为隐式额外参数传递给C函数的对象”。

我的问题:子类化时是否有任何方法可以覆盖内置方法?

[编辑]第二个问题:如果不是,为什么不呢?

最佳答案

我知道这不能回答您的问题,但是您可以将套接字放入实例变量中。这是没人在评论中建议的。

class ICMPSocket():
    def __init__(self):
        self.s = socket.socket(
            socket.AF_INET,
            socket.SOCK_RAW,
            socket.getprotobyname("icmp"))
    def sendto(self, data, host):
        self.s.sendto(data, (host, 1))
    def __getattr__(self, attr):
        return getattr(self.s, attr)

关于python - Python中的子类化和内置方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6976094/

10-13 07:11