[Python-es] Consulta sobre interfaces y clases abstractas

Chema Cortes pych3m4 en gmail.com
Dom Mayo 4 17:40:25 CEST 2014


El 3 de mayo de 2014, 23:26, Cristian Godoy <cristiangodoyy en gmail.com>escribió:

> Hola vengo de programar en Java y recién estoy comenzando a conocer la
> sintaxis de Python. Quisiera saber si existen las interfaces y clases
> abstractas en Python.
> Muchas gracias.
>
> Las clases abstractas en python no son otra cosa que avisos que se hacen a
quien las vaya a usar para que no las instancie y sólo las use para crear
subclases. Pero python es un lenguaje dinámico, por lo que siempre será
posible instanciar cualquier clase y siempre derivar subclases a partir de
cualquier clase (hay formas de cambiar este comportamiento, pero son casos
raros).

En cuanto a los interfaces, en java se abusa de ellos para obtener algo de
herencia múltiple. Python tiene herencia múltiple completa, por lo que
añadir interfaces es añadir más clases a la herencia.

Por otro lado, lo que sería usar interfaces como patrones estructurales de
los atributos y métodos que debe tener un objeto, en python se conoce por
"protocolo". Al ser dinámico, no existe chequeo de tipos de datos, por que
hay diversas APIs que tan sólo esperan que los objetos cumplan con un
protocolo determinado. Por ejemplo, muchas funciones esperan un objeto que
se parezca a un objecto file, con métodos read() y write(), pero sin ser
necesario que sean ficheros reales. De este modo, donde se pasaría un
fichero, se puede pasar una url, la lectura de un puerto serie o un stream
de memoria,

Como es bastante tedioso andar comprobando los atributos y métodos que
tiene un objeto para saber si cumple o no con determinado protocolo, la
librería estándar facilita una colección de clases base abstractas
(ABC-Abstract Base Classes) para poder fijar las relaciones entre clases,
bien derivando de estas clases abstractas, bien registrando nuevas clases
abstractas en esta jerarquía (siempre de un modo virtual).

Tienes clases abstractas en los módulos io (streams), collections
(estructuras de datos), numbers e importlib, así como crear nuevas con el
mòdulo abc. Se supone que, con el tiempo, se irán ampliando.

Por ejemplo: imagínate que tienes un fichero codificado que quieres que se
codifique/decodifique al vuelo. Hay una clase abstracta llamada
io.TextIOBase que ofrece el protocolo de fichero plano de texto. Tienes dos
opciones: a) derivas tu clase a partir de esta clase abstracta, b) registra
tu clase como subclase de la clase abstracta

Opción 1:

from io import TextIOBase

class CryptoFile(TextIOBase):
    ...

Opción2:

from io import TextIOBase
TextIOBase.register(CryptoFile)

En esta opción, CryptoFile podría venir de otra librería que no fuera
nuestra.


En ambos casos se cumple:

issubclass(CryptoFile, TextIOBase)
isinstance(CryptoFile(...), TextIOBase)


Donde se pueda pasar una instancia TextIOBase se podría pasar una instancia
CryptoFile (no hay covariancias ni contravariancias en python).


-- 
Hyperreals *R  "Quarks, bits y otras criaturas infinitesimales":
http://ch3m4.org/blog
Buscador Python Hispano: http://ch3m4.org/python-es
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20140504/ae09d494/attachment.html>


Más información sobre la lista de distribución Python-es