No se puede, con primitivas del lenguaje. Como se ha llamado, el abc package proporciona esta funcionalidad en Python 2.6 y posterior, pero no hay opciones para Python 2.5 y versiones anteriores. El paquete abc
no es una característica nueva de Python; en su lugar, agrega funcionalidad al agregar explícita "¿esta clase dice que hace esto?" verificaciones, con verificaciones de consistencia implementadas manualmente para causar un error durante la inicialización si tales declaraciones son falsas.
Python es un lenguaje militantemente tipado dinámicamente. No especifica las primitivas del lenguaje para permitirle evitar que un programa se compile porque un objeto no coincide con los requisitos de tipo; esto solo se puede descubrir en tiempo de ejecución. Si requiere que una subclase implemente un método, documente eso, y luego simplemente llame al método con la certera esperanza de que estará allí.
Si está allí, fantástico, simplemente funciona; esto se llama duck typing, y su objeto se ha grabado lo suficiente como un pato para satisfacer la interfaz. Esto funciona muy bien incluso si self
es el objeto que está llamando un método en, a los efectos de anulaciones obligatorias debido a los métodos básicos que necesitan implementaciones específicas de características (funciones genéricas), porque self
es una convención, nada realmente especial.
La excepción está en __init__
, porque cuando se llama a su inicializador, el inicializador del tipo derivado no, por lo que aún no ha tenido la oportunidad de grapar sus propios métodos en el objeto.
Si el método no se implementó, obtendrá un AttributeError (si no está allí) o un TypeError (si hay algo con ese nombre pero no es una función o no tiene esa firma)) Depende de usted cómo maneja eso, ya sea que lo llame error de programador y deje que bloquee el programa (y "debería" ser obvio para un desarrollador de Python lo que causa ese tipo de error allí - una interfaz de pato no satisfecha), o atrape y maneje esas excepciones cuando descubres que tu objeto no era compatible con lo que deseas. La captura de AttributeError y TypeError es importante en muchas situaciones, en realidad.
Por cierto, esto fue una ocurrencia tardía en Python. las interfaces abstractas y otras fueron recientemente introducidas. Como Python no está compilado, debe dejar clara su intención en la documentación en lugar de las clases abstractas. – Falmarri