Я работаю в Java, но уверен, что в Python будут применяться те же принципы. Как правило, вы не должны никогда наследовать от класса, реализацию которого вы не понимаете и не контролируете, если этот класс не был разработан специально для наследования. Если он был разработан таким образом, он должен четко описать это в своей документации.
Причина этого в том, что наследование потенциально может связать вас с деталями реализации класса, от которого вы наследуете.
Использовать пример из книги Джоша Блоха «Эффективная Java»
Если бы мы расширили класс ArrayList
, чтобы иметь возможность подсчитать количество элементов, которые были добавлены к нему в течение срока его службы (не обязательно того, что он содержит в настоящее время), у нас может возникнуть желание написать как то так.
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.
}
Теперь это расширение выглядит так, будто оно будет точно подсчитывать количество элементов, которые были добавлены в список, но на самом деле оно может и не быть. Если ArrayList
реализовал addAll
путем итерации по предоставленному Collection
и вызова его метода интерфейса addAll
для каждого элемента, то мы будем считать каждый элемент, добавленный с помощью метода addAll
, дважды. Теперь поведение нашего класса зависит от деталей реализации ArrayList
.
Это, конечно, в дополнение к недостатку невозможности использовать другие реализации List
с нашим классом CountingList
. Плюс недостатки наследования от конкретного класса, которые обсуждались выше.
Насколько я понимаю, Python использует аналогичный (если не идентичный) механизм отправки методов для Java и поэтому будет подвергаться тем же ограничениям. Если бы кто-то мог привести пример на Python, я уверен, что он был бы еще более полезным.