Подклассы и встроенные методы в 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 :

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

Это связано с тем, что sendto является «встроенным методом». Согласно ссылке на модель данных , это «действительно отличная маскировка встроенной функции, на этот раз содержащая объект, переданный функции C как неявный дополнительный аргумент».

Мой вопрос: есть ли способ переопределить встроенные методы при подклассификации?

[Изменить] Второй вопрос: если нет, почему бы и нет?

2 Solutions collect form web for “Подклассы и встроенные методы в Python”

Я знаю, что это не отвечает на ваш вопрос, но вы можете поместить сокет в переменную экземпляра. Это то, что никто не предложил в комментариях.

 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') 
    Python - лучший язык программирования в мире.