Как построить иерархию классов
Построение иерархии классов - это не просто искусство ради искусства.
Если Вы разделяете проблему между классами и решаете, какой из них должен быть расположен вверху, а какой - внизу иерархии, Вам необходимо тщательно проанализировать проблему, но прежде чем мы покажем Вам, как это делать (и как этого не делать) мы хотим подчеркнуть интересный эффект. В этом нет ничего необычного (это просто следствие общих правил, представленных ранее), но помните, что это может быть ключом к пониманию того, как работают некоторые коды, и как этот эффект можно использовать для создания гибкого набора классов.
Посмотрите на код в редакторе. Давайте проанализируем это:
- есть два класса с именами
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: "форма"), что означает, что один и тот же класс может принимать различные формы в зависимости от переопределений, сделанных любым из его подклассов.
Метод, переопределенный в любом из суперклассов и изменяющий поведение суперкласса, называется виртуальным.
Другими словами, ни один класс не дается раз и навсегда. Поведение каждого класса может быть изменено в любое время любым из его подклассов.
Мы собираемся показать вам, как использовать полиморфизм для повышения гибкости класса.