Наследование
Наследование — механизм создания новых классов (классов-наследников) на основе существующих (базовых классов). Класс-наследник автоматически получает все поля (атрибуты) и методы базового класса. Пример:
Базовый класс Person с полями name (имя) и age (возраст). Класс-наследник Student, дополнительно содержащий поля course (курс обучения) и gpa (средний балл):
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def set_age(self, age):
self.age = age
class Student(Person):
def __init__(self, name, age, course):
super().__init__(name, age) # Вызов конструктора базового класса
self.course = course
igor = Student("Игорь", 19, 1)
print(igor.name) # Выведет "Игорь"
igor.set_age(20) #Используем метод из базового класса
print(igor.age) # Выведет 20
print(igor.course) # Выведет 1
igor.course = 2 # Изменяем поле класса-наследника
print(igor.course) # Выведет 2
Student наследует метод set_age от Person. Можно добавлять новые поля и методы в класс-наследник, расширяя функциональность базового класса. Это удобно для организации кода, особенно в иерархии классов, например, Person -> Student, Schoolchild, Pensioner.
Инкапсуляция
Инкапсуляция — механизм ограничения доступа к полям и методам класса. В Python нет строгих модификаторов доступа (как public, private, protected в других языках). Однако, соглашение о добавлении одного или двух нижних подчеркиваний к имени поля или метода сигнализирует об ограничении доступа.
- Одно нижнее подчеркивание (_name): Рекомендация не использовать за пределами класса. Доступ все же возможен.
- Два нижних подчеркивания (__name): Более строгая рекомендация. Python изменяет имя атрибута (name mangling), делая его доступным только изнутри класса.
class Person:
def __init__(self, name, age):
self._name = name # Рекомендация - не использовать снаружи класса
self.__age = age # Более строгая рекомендация
def get_age(self):
return self.__age
_name и __age — поля, к которым рекомендуется не обращаться напрямую извне класса. Для доступа к __age используется метод get_age. Прямой доступ к __age может привести к ошибке.
Полиморфизм
Полиморфизм означает «много форм». Он позволяет использовать один и тот же метод в разных классах с разной реализацией. Пример:
print(1 + 1) # 2 (сложение чисел)
print("2" + "2") # 22 (конкатенация строк)
Оператор + выполняет сложение для чисел и конкатенацию для строк. Это полиморфизм — один оператор, разные действия в зависимости от типа данных.
Наследование, инкапсуляция и полиморфизм — фундаментальные концепции объектно-ориентированного программирования. Понимание этих концепций важно для написания эффективного и поддерживаемого кода на Python.