Vengo de un entorno Java pero estoy bastante seguro de que se aplicarán los mismos principios en Python. Como regla general, debe nunca heredar de una clase cuya implementación no comprenda ni controle a menos que dicha clase se haya diseñado específicamente para herencia. Si ha sido diseñado de esta manera, debe describir esto claramente en su documentación.
La razón de esto es que la herencia puede potencialmente vincularlo a los detalles de implementación de la clase que está heredando.
Para usar un ejemplo del libro de Josh Bloch 'Effective Java'
Si nos vamos a extender la clase clase ArrayList
con el fin de ser capaz de contar el número de elementos que se agregaron a la misma durante su tiempo de vida (no necesariamente el número que contiene actualmente), podemos sentirnos tentados de escribir algo como esto.
public class CountingList extends ArrayList {
int counter = 0;
public void add(Object o) {
counter++;
super.add(0);
}
public void addAll(Collection c) {
count += c.size();
super.addAll(c);
}
// Etc.
}
Ahora esta extensión parece que sería contar con precisión el número de elementos que se agregaron a la lista, pero, de hecho, puede que no. Si ArrayList
ha implementado addAll
iterando sobre el Collection
provisto y llamando a su método de interfaz addAll
para cada elemento, contaremos dos veces cada elemento agregado mediante el método addAll
. Ahora el comportamiento de nuestra clase depende de los detalles de implementación de ArrayList
. Por supuesto, además de la desventaja de no poder utilizar otras implementaciones de List
con nuestra clase CountingList
. Además de las desventajas de heredar de una clase concreta que se discutieron anteriormente.
Tengo entendido que Python utiliza un mecanismo de envío de métodos similar (si no idéntico) a Java y, por lo tanto, estará sujeto a las mismas limitaciones. Si alguien pudiera dar un ejemplo en Python, estoy seguro de que sería aún más útil.