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