Наследование
Наследование — это способность объекта принимать одну или несколько характеристик от других классов объектов, обычно переменных или функций-членов. Можно провести аналогию между этим понятием и наследственностью как передачей характерных черт от родителей к потомству. Например, у ребенка могут быть глаза отца и улыбка матери. Глаза отца и улыбка матери — это черты, которые ребенок наследует от своих родителей. Они выглядят/проявляются одинаково у родителей и потомства.
Информатика использует понятие наследования при создании классов, между которыми устанавливаются отношения “род-вид”. В отношениях “род-вид” один объект связан с другим объектом. Например, собака — это домашнее животное, сельдерей — овощ, а Марс — планета. В отношениях “род-вид” есть две сущности: родитель и ребенок. Родитель в этих отношениях является общей версией ребенка. Собака (ребенок) — это домашнее животное (родитель). В информатике мы называем родительский класс в отношениях “род-вид” “суперклассом”, а дочерний — “подклассом”. Подкласс наследует методы и/или переменные от суперкласса. Теперь напишем код для отношений 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. Поначалу эти понятия, возможно, будет непросто усвоить. Лучший способ справиться с этим — разработать классы, которые отражают сущности реального мира, а затем идентифицировать свойственные им отношения “род-вид”.
Читайте также:
- 4 совета Python Django разработчику
- Python Django: контактная форма с автоматической отправкой Email
- Python для начинающих: какая разница между tuple, list и set?
Читайте нас в Telegram, VK и Яндекс.Дзен
Перевод статьи Banana Chip Tech: Inheritance and Polymorphism in Python