Re: [Python-es] Otra vez la herencia múltiple

Hernan M Foffani hfoffani en gmail.com
Mar Jul 29 13:20:15 CEST 2008


Lo importante es que entiendas las diferencias entre los distintos
lenguajes de programación, cuál es el "espíritu" de cada uno y
puedas adaptarte a ellos.
No es una buena idea aplicar la misma receta para todos.

> - Si es posible, evitar la herencia multiple, usando tipos (interfaces) para
> definir otra funcionalidad o protocolos de comunicación que debe tener la
> clase hija.

El Python estándar no trae interfaces como se conocen en otros lenguajes.
Hay algunas extensiones externas que se pueden usar, como las de Zope,
Twister o PEAK. Incluso te podrías montar tu propio framework de interfaces
sin demasiado problema. El mayor inconveniente es la falta de estandarización
y eso es lo que impide que se extienda su uso.

Esta situación cambiará dentro de poco con la introducción de las ABC
(Abstract Base Classes).

> - Si tenemos class A (B,C,D), A hereda de B e implementa los tipos C y D, o
> le añaden funcionalidad a traves de los mixins C y D.

En python dado
   class A (B,C,D)
solo puedes deducir lo siguiente:
   si un objeto a es una instancia de A, entonces
   a es_un A, a es_un B, a es_un C y a es_un D.

Sin conocer qué son A, B, C y D, no se puede decir mucho mas del tema.

Que en python uses la misma construcción para decir:
   class Cerdo (Mamifero, Volador, VidaCarbono)
y
   class Cubo (Forma, Iterador, Persistente, Auditable)
no es relevante. Que la herencia múltiple te permita definir
una estructura de clases tanto como grafo dirigido o cómo árbol y también
te permita enriquecer la funcionalidad via mixins, sólo muestra la flexibilidad
que el lenguaje brinda al programador.

Con la incorporación de las ABC el lenguaje ahora tiene una forma estándar
de decir si una clase cumple con un determinado protocolo (interface) y además
define un conjunto amplio de ellos para que puedan ser usados ampliamente.

Lo bonito de las ABC es que encajan perfectamente dentro de la herencia
múltiple de Python. Además son mucho mas flexibles que las interfaces de
otros lenguajes (Java o C#) dado que son clases abstractas permiten definir
comportamiento. Extrictamente hablando la única "extensión" al lenguaje fue
para permitir la extensión de una jerarquía ABC dada con clases provistas por
el usuario (mediante la sobrecarga de isinstance() e issubclass())

> Supongo que se me olvidará algo... pero lo importante son las ideas
> generales.
>
> La verdad, viendo como otros lenguajes como Delphi, el Java, el C# (que
> comenta Medardo) donde se pueden definir a nivel de lenguaje programación
> varios conceptos, me da penilla ver que python no tiene esa potencia y tener
> que recurrir a construcciones para implementarlas.

No comparto esta afirmación.

-H.


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