Наследование классов в Python на простых примерах

В этом руководстве вы узнаете о наследовании в Python и о том, как использовать наследование для повторного использования кода из существующего класса.

Содержание

Что такое наследование в Python?

Наследование позволяет классу повторно использовать логику существующего класса. Предположим, у вас есть следующий класс Person:

class Person:
    def __init__(self, name):
        self.name = name

    def greet(self):
        return f"Hi, it's {self.name}"

Класс Person имеет атрибут name и метод Greeting().

Теперь вы хотите определить класс Employee, похожий на класс Person:

class Employee:
    def __init__(self, name, job_title):
        self.name = name
        self.job_title = job_title

    def greet(self):
        return f"Hi, it's {self.name}"

Класс «Employee» имеет два атрибута: name и job_title. Он также имеет метод greet(), который точно такой же, как метод greet() класса Person.

Чтобы повторно использовать метод greet() из класса Person в классе Employee, вы можете создать связь между классами Person и Employee. Для этого вы используете наследование, так что класс «Employee» наследуется от класса «Person».

Следующий код переопределяет класс «Employee», который наследуется от класса «Person»:

class Employee(Person):
    def __init__(self, name, job_title):
        self.name = name
        self.job_title = job_title

При этом класс «Employee» ведет себя так же, как класс «Person», без переопределения метода greet().

Это единое наследование, поскольку Employee наследуется от одного класса (Person). Обратите внимание, что Python также поддерживает множественное наследование, когда класс наследуется от нескольких классов.

Поскольку класс «Employee» наследует атрибуты и методы класса «Person», вы можете использовать экземпляр класса «Employee», как если бы он был экземпляром класса «Person».

Например, следующая команда создает новый экземпляр класса «Employee» и вызывает метод greet():

employee = Employee('John', 'Python Developer')
print(employee.greet())

Выход:

Hi, it's John

Терминология наследования

Класс Person является родительским классом, базовым классом или суперклассом класса Employee. А класс «Employee» является дочерним классом, производным классом или подклассом класса «Person».

Класс «Employee» является производным от класса «Person», расширяет его или является подклассом.

Связь между данными классами представляет собой связь IS-A. Другими словами, сотрудник – это личность.

Применение метода isinstance()

Ниже показаны типы экземпляров классов Person и Employee:

person = Person('Jane')
print(type(person))

employee = Employee('John', 'Python Developer')
print(type(employee))

Выход:

<class '__main__.Person'>
<class '__main__.Employee'>

Чтобы проверить, является ли объект экземпляром класса, вы используете метод isinstance(). Например:

person = Person('Jane')
print(isinstance(person, Person))  # True

employee = Employee('John', 'Python Developer')
print(isinstance(employee, Person))  # True
print(isinstance(employee, Employee))  # True
print(isinstance(person, Employee))  # False

Выход:

True
True
True
False

Как ясно показано в выводе:

  • Человек является экземпляром класса Person.
  • Сотрудник является экземпляром класса Employee. Это также экземпляр класса Person.
  • Человек не является экземпляром класса Employee.

На практике вы часто будете использовать функцию isinstance(), чтобы проверить, имеет ли объект определенные методы. Затем вы вызовете методы этого объекта.

Функция issubclass()

Чтобы проверить, является ли класс подклассом другого класса, вы используете функцию issubclass(). Например:

print(issubclass(Employee, Person)) # True

Ниже определяется класс SalesEmployee, который наследуется от класса Employee:

class SalesEmployee(Employee):
    pass

SalesEmployee является подклассом класса Employee. Это также подкласс класса Person, как показано ниже:

print(issubclass(SalesEmployee, Employee)) # True
print(issubclass(SalesEmployee, Person)) # True

Обратите внимание: когда вы определяете класс, который не наследуется ни от одного класса, он неявно наследуется от встроенного класса object.

Например, класс Person неявно наследуется от класса object. Следовательно, это подкласс класса object:

print(issubclass(Person, object)) # True

Другими словами, все классы являются подклассами класса object.

Похожие посты
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *