Перейти до змісту

Успадкування в Python

В Python синтаксис для наслідування класів виглядає наступним чином: при створенні класа після його імені в круглих дужках можна вказати імена одного або декількох суперкласів.

class Base:
    pass

class Child(Base):
    pass

У вищенаведеному коді:

  • Child — це дочірній (похідний) клас, підклас
  • Base — це базовий (батьківський) клас, суперклас

В Python є вбудований клас який має назву object. Від цього класа явно чи неявно успадковуються усі інші класи, як вбудовані, так і ті, що створююте ви. Якщо при створенні класа ви не вказуєте базовий клас, то неявним чином ваш клас буде успадковано від object. Отже наступні оголошення класа рівносильні:

class Base:
    pass

class Base():
    pass

class Base(object):
    pass

Ієрархія успадкування

Клас може бути успадкованим від класа, який у свою чергу було успадковано від іншого класа. Коли розглядають увесь ланцюжок успадкованих і базових класів, говорять про ієрархію успадкування.

Розглянемо наступну ієрархію класів:

>>> class SuperBase:
...     pass
...
>>> class Base(SuperBase):
...     pass
...
>>> class Child(Base):
...     pass
...
>>>

У вищенаведеному прикладі:

  • клас SuperBase успадковано від object
  • клас Base успадковано від SuperBase
  • клас Child успадковано від Base

Дізнатись, чи є певний клас підкласом іншого класа по всій ієрархії успадкування, можна за допомогою вбудованої функції:

issubclass(cls, super_class)

Функція повертає True якщо cls є дочірнім класом super_class або ж є тим самим класом.

Розвиваючи вищенаведений приклад:

>>> issubclass(Child, Base)
True
>>> issubclass(Child, SuperBase)
True
>>> issubclass(Child, object)
True
>>> issubclass(Child, Child)
True
>>> issubclass(SuperBase, object)
True
>>> issubclass(SuperBase, Base)
False
>>> issubclass(str, object)
True
>>>

Функції issubclass другим аргументом можна передати одразу декілька класів об'єднаних у кортеж. У такому разі функція поверне True якщо вказаний клас є дочірнім хоча б одному з перерахованих:

>>> issubclass(Base, (Child, SuperBase))
True
>>> issubclass(Base, (Child, str))
False
>>> issubclass(Base, (object, str))
True
>>>

А тепер вкотре згадаємо що "в Python усе є об'єкт". І класи тут теж не виключення, тобто класи — це теж об'єкти. І як об'єкти вони мають свої атрибути.

У кожного класа є спеціальний атрибут __bases__, у якому міститься базовий клас, точніше кортеж який містить усі базові класи (чому їх може бути декілька — дізнаємось у подальшому):

>>> Child.__bases__
(<class '__main__.Base'>,)
>>> SuperBase.__bases__
(<class 'object'>,)
>>>
Back to top