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/