Chema, si no lo tienes en tu blog, deberias agregarlo
El 4 de mayo de 2014, 10:40, Chema Cortes <pych...@gmail.com> escribió: > El 3 de mayo de 2014, 23:26, Cristian Godoy > <cristiangod...@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@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@python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/