Наследование и полиморфизм в Python

Наследование

Наследование  —  это способность объекта принимать одну или несколько характеристик от других классов объектов, обычно переменных или функций-членов. Можно провести аналогию между этим понятием и наследственностью как передачей характерных черт от родителей к потомству. Например, у ребенка могут быть глаза отца и улыбка матери. Глаза отца и улыбка матери  —  это черты, которые ребенок наследует от своих родителей. Они выглядят/проявляются одинаково у родителей и потомства.

Информатика использует понятие наследования при создании классов, между которыми устанавливаются отношения “род-вид”. В отношениях “род-вид” один объект связан с другим объектом. Например, собака  —  это домашнее животное, сельдерей  —  овощ, а Марс  —  планета. В отношениях “род-вид” есть две сущности: родитель и ребенок. Родитель в этих отношениях является общей версией ребенка. Собака (ребенок)  —  это домашнее животное (родитель). В информатике мы называем родительский класс в отношениях “род-вид” “суперклассом”, а дочерний  —  “подклассом”. Подкласс наследует методы и/или переменные от суперкласса. Теперь напишем код для отношений dog/pet (собака/домашнее животное).

Создание подкласса

class Pet:
  def __init__(self,name=""):
    print("Hi! I'm your new pet! My name is: %s" % name)
    self.name = name  

def feedme(self):
    print("%s says: I'm hungry! Feed me!" % self.name)  

def eat(self,food_name):
    print("%s just ate a %s" %(self.name,food_name))

# Создайте класс Dog, который наследует классу Pet
class Dog(Pet):
  def __init__(self,name=""):
    print("Hi! I'm your new dog!")
    self.name = name

# Протестируйте программу
d = dog()

d.feedme()

d.eat("Potato")

Обратите внимание на то, что в приведенных примерах для создания класса Dog мы заключаем Pet в скобки в объявлении класса: Dog(Pet). Использование этого синтаксиса позволяет сообщить Python, что класс, который мы создаем, является подклассом суперкласса Pet. Поскольку ни один из методов и переменных в классе Pet не является закрытым, подкласс Dog сможет получить доступ ко всем элементам класса Pet. Именно так экземпляр собаки способен вызывать методы feedme() и eat().

Некоторые атрибуты класса могут быть созданы закрытыми. Создать переменную закрытой означает, что этот атрибут не будет доступен подклассу. Имейте это в виду при проектировании классов!

Полиморфизм

Теперь, когда вы получили представление о наследовании, можно перейти к понятию “полиморфизм”. Полиморфизм  —  это способность чего-либо иметь несколько форм. Вернемся к предыдущему примеру. Все домашние животные в конечном итоге нуждаются в еде, но способ, которым они питаются, может отличаться. Например, попугай будет есть, клюя корм для птиц, в то время как собака будет есть, пережевывая собачий корм. И попугай, и собака  —  домашние животные, которые едят пищу, но разница в том, что они едят разную пищу по-разному. Взглянем на пример в коде.

class Pet:
  def __init__(self,name=""):
    self.name = name  

def feedme(self):
    print("%s says: I'm hungry! Feed me!" % self.name)  

def eat(self,food_name):
    print("%s just ate a %s" %(self.name,food_name))

# Создайте класс Dog, который наследует классу Pet
class Dog(Pet):
  def __init__(self,name=""):
    print("Hi! I'm your new dog!")
    self.name = name  

def eat(self,food_name):
    print("%s is chewing!" % (self.name))
    print("%s just ate a %s" %(self.name,food_name))

# Создайте класс Parrot, который наследует классу Pet
class Parrot(Pet):
  def __init__(self,name=""):
    print("Hi! I'm your new parrot!")
    self.name = name
 
  def eat(self,food_name):
    print("%s is pecking at their food!" % (self.name))
    print("%s just ate a %s" %(self.name,food_name))

В этом примере собака и попугай переопределяют метод eat(self,food_name). Переопределение метода означает, что метод в подклассе переопределяет метод, указанный в суперклассе. В этом суть полиморфизма: один и тот же метод, но разные характеристики в зависимости от класса.

Заключение

Мы кратко рассмотрели наследование и полиморфизм в Python. Поначалу эти понятия, возможно, будет непросто усвоить. Лучший способ справиться с этим  —  разработать классы, которые отражают сущности реального мира, а затем идентифицировать свойственные им отношения “род-вид”.

Читайте также:

Читайте нас в TelegramVK и Яндекс.Дзен


Перевод статьи Banana Chip Tech: Inheritance and Polymorphism in Python

Предыдущая статья3 новых настораживающих примера ИИ-систем