Module (76%)
Section (65%)

Как построить иерархию классов

Построение иерархии классов - это не просто искусство ради искусства.

Если Вы разделяете проблему между классами и решаете, какой из них должен быть расположен вверху, а какой - внизу иерархии, Вам необходимо тщательно проанализировать проблему, но прежде чем мы покажем Вам, как это делать (и как этого не делать) мы хотим подчеркнуть интересный эффект. В этом нет ничего необычного (это просто следствие общих правил, представленных ранее), но помните, что это может быть ключом к пониманию того, как работают некоторые коды, и как этот эффект можно использовать для создания гибкого набора классов.

Посмотрите на код в редакторе. Давайте проанализируем это:

  • есть два класса с именами 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: "форма"), что означает, что один и тот же класс может принимать различные формы в зависимости от переопределений, сделанных любым из его подклассов.

Метод, переопределенный в любом из суперклассов и изменяющий поведение суперкласса, называется виртуальным.

Другими словами, ни один класс не дается раз и навсегда. Поведение каждого класса может быть изменено в любое время любым из его подклассов.

Мы собираемся показать вам, как использовать полиморфизм для повышения гибкости класса.



Code

class One:
def do_it(self):
print("do_it from One")

def doanything(self):
self.do_it()


class Two(One):
def do_it(self):
print("do_it from Two")


one = One()
two = Two()

one.doanything()
two.doanything()
{{ dockerServerErrorMsg }} ×
{{ errorMsg }} ×
{{ successMsg }} ×