Python中的子类和内置方法

gri*_*ton 6 python subclassing

为方便起见,我想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))
Run Code Online (Sandbox Code Playgroud)

但是,我无法覆盖socket.sendto:

>>> s = icmp.ICMPSocket()
>>> s.sendto
<built-in method sendto of _socket.socket object at 0x100587f00>
Run Code Online (Sandbox Code Playgroud)

这是因为它sendto是一种"内置方法".根据数据模型引用,这"实际上是内置函数的不同伪装,这次包含作为隐式额外参数传递给C函数的对象."

我的问题:无论如何都要在子类化时覆盖内置方法?

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

Kar*_*ath 6

我知道这不能解答您的问题,但您可以将套接字放入实例变量中.这是Nobody在评论中也提出的建议.

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)
Run Code Online (Sandbox Code Playgroud)