[Python-es] Consulta sobre interfaces y clases abstractas

Cristian Godoy cristiangodoyy en gmail.com
Mie Mayo 7 19:04:03 CEST 2014


Muchas gracias por todos los comentarios, me han ayudado mucho.
Saludos.


El 6 de mayo de 2014, 18:24, Miguel Beltran R. <yourpadre en gmail.com>escribió:

> 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
>
> _______________________________________________
> Python-es mailing list
> Python-es en python.org
> https://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/
>
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20140507/8ba71a80/attachment.html>


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