Наследование классов в Python на простых примерах
В этом руководстве вы узнаете о наследовании в Python и о том, как использовать наследование для повторного использования кода из существующего класса.
- Что такое наследование в Python?
- Терминология наследования
- Применение метода isinstance()
- Функция issubclass()
Что такое наследование в 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.