[Python-es] Consulta sobre interfaces y clases abstractas

Miguel Beltran R. yourpadre en gmail.com
Mar Mayo 6 23:24:53 CEST 2014


Chema, si no lo tienes en tu blog, deberias agregarlo


El 4 de mayo de 2014, 10:40, Chema Cortes <pych3m4 en gmail.com> escribió:

> 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
>
> _______________________________________________
> Python-es mailing list
> Python-es en python.org
> https://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/
>
>


-- 
________________________________________
Lo bueno de vivir un dia mas
es saber que nos queda un dia menos de vida
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20140506/48dcb6d3/attachment.html>


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