Python中的子类化和内建方法

2024-10-01 15:40:11 发布

您现在位置:Python中文网/ 问答频道 /正文

为了方便起见,我想子类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

^{pr2}$

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

我的问题是:在子类化时有没有重写内置方法?在

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


Tags: 方法函数selfhostdatainitdefsocket
2条回答

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

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套接字,可以说聚合比继承好得多,但是如果您想知道如何做到这一点 它使用继承检查以下代码:

import socket


class ICMPSocket(socket.socket):
    def __init__(self):

        self._sock = socket.socket(
                        socket.AF_INET,
                        socket.SOCK_RAW,
                        socket.getprotobyname("icmp"))

        # Delete the methods overrited by the socket initializer to make
        # possible defining our own.
        for attr in socket._delegate_methods:
            try:
                delattr(self, attr)
            except AttributeError:
                pass

    def sendto(self, data, flags, addr):
        return self._sock.sendto(data, flags, (addr, 1))

icmp = ICMPSocket()

print icmp.sendto('PING', 0, '127.0.0.1')

相关问题 更多 >

    热门问题