Как построить иерархию классов
Построение иерархии классов - это не просто искусство ради искусства.
Если Вы разделяете проблему между классами и решаете, какой из них должен быть расположен вверху, а какой - внизу иерархии, Вам необходимо тщательно проанализировать проблему, но прежде чем мы покажем Вам, как это делать (и как этого не делать) мы хотим подчеркнуть интересный эффект. В этом нет ничего необычного (это просто следствие общих правил, представленных ранее), но помните, что это может быть ключом к пониманию того, как работают некоторые коды, и как этот эффект можно использовать для создания гибкого набора классов.
Посмотрите на код в редакторе. Давайте проанализируем это:
- есть два класса с именами
OneиTwo, аTwoявляется производным отOne. Ничего особенного. Тем не менее, одна вещь, на которую стоит обраить внимание - методdoit(). - метод
doit()определен дважды: первоначально внутриOne, а затем внутриTwo. Суть примера заключается в том, что он вызывается только один раз - внутриOne.
Вопрос в том, какой из двух методов будет вызываться последними двумя строками кода?
Первый вызов кажется простым, и на самом деле он прост - вызов doanything() из объекта с именем one, очевидно, активирует первый из методов. р>
Второй вызов требует некоторого внимания. Это также просто, если Вы помните, как Python находит компоненты класса. Второй вызов запустит doit() в форме, существующей внутри класса Two, независимо от того, что вызов происходит внутри класса One.
По сути, код производит следующий вывод:
do_it from One
do_it from Two
output
Примечание: ситуация, в которой подкласс может изменять свое поведение суперкласса (как в примере), называется полиморфизмом. Слово происходит от греческого (polys: "многие, много" и morphe: "форма"), что означает, что один и тот же класс может принимать различные формы в зависимости от переопределений, сделанных любым из его подклассов.
Метод, переопределенный в любом из суперклассов и изменяющий поведение суперкласса, называется виртуальным.
Другими словами, ни один класс не дается раз и навсегда. Поведение каждого класса может быть изменено в любое время любым из его подклассов.
Мы собираемся показать вам, как использовать полиморфизм для повышения гибкости класса.