Объектно-ориентированное программирование в Python: классы, наследование, инкапсуляция и полиморфизм
Объектно-ориентированное программирование в Python
Это руководство ведёт вас через основные концепции объектно-ориентированного программирования (ООП) в Python, с практическими примерами, иллюстрирующими, как строить надёжный, переиспользуемый код.
Видео: Объектно-ориентированное программирование в Python
Объектно-ориентированное программирование
Python — мультипарадигмальный язык, поддерживающий несколько стилей программирования. Один из самых мощных подходов — моделирование задач с помощью объектов — подход, известный как объектно-ориентированное программирование (ООП).
Объект обладает двумя существенными характеристиками:
- Атрибуты (данные)
- Поведение (методы)
Например, попугай — объект с атрибутами name, age, color и поведением sing() и dance().
ООП в Python способствует переиспользованию кода, следуя принципу DRY (Don't Repeat Yourself — не повторяйся).
Класс
class — это чертеж, определяющий структуру и поведение объектов. Думайте о нём как о подробном чертеже попугая: он указывает, какие свойства и действия может иметь попугай.
class Parrot:
pass
Здесь Parrot — пустой класс. Экземпляры этого класса создаются позже.
Объект
Объект (или экземпляр) — это конкретная реализация класса. Когда класс определяется, память не выделяется; существует только шаблон. Создание экземпляра класса порождает объект.
obj = Parrot()
В примере ниже мы строим функциональный класс Parrot и создаём два экземпляра, blu и woo:
class Parrot:
# Атрибут класса
species = "bird"
# Атрибуты экземпляра
def __init__(self, name, age):
self.name = name
self.age = age
# Создание экземпляров
blu = Parrot("Blu", 10)
woo = Parrot("Woo", 15)
# Доступ к атрибутам класса
print("Blu is a {}".format(blu.__class__.species))
print("Woo is also a {}".format(woo.__class__.species))
# Доступ к атрибутам экземпляра
print("{} is {} years old".format(blu.name, blu.age))
print("{} is {} years old".format(woo.name, woo.age))
Вывод
Blu is a bird Woo is also a bird Blu is 10 years old Woo is 15 years old
В этом фрагменте species — атрибут класса, общий для всех попугаев, тогда как name и age — атрибуты экземпляра, уникальные для каждого объекта.
Методы
Методы — функции, определённые внутри класса, описывающие поведение объекта. Они вызываются на экземплярах класса.
class Parrot:
def __init__(self, name, age):
self.name = name
self.age = age
def sing(self, song):
return f"{self.name} sings {song}"
def dance(self):
return f"{self.name} is now dancing"
# Создание экземпляра и использование методов
blu = Parrot("Blu", 10)
print(blu.sing("'Happy'"))
print(blu.dance())
Вывод
Blu sings 'Happy' Blu is now dancing
Наследование
Наследование позволяет новому классу унаследовать атрибуты и методы от существующего, способствуя переиспользованию кода и логической иерархии.
# Базовый класс
class Bird:
def __init__(self):
print("Bird is ready")
def whoisThis(self):
print("Bird")
def swim(self):
print("Swim faster")
# Производный класс
class Penguin(Bird):
def __init__(self):
super().__init__()
print("Penguin is ready")
def whoisThis(self):
print("Penguin")
def run(self):
print("Run faster")
peggy = Penguin()
peggy.whoisThis()
peggy.swim()
peggy.run()
Вывод
Bird is ready Penguin is ready Penguin Swim faster Run faster
Инкапсуляция
Инкапсуляция ограничивает прямой доступ к внутреннему состоянию объекта, защищая целостность данных. В Python приватные атрибуты обозначаются начальным подчёркиванием (одинарным или двойным).
class Computer:
def __init__(self):
self.__maxprice = 900
def sell(self):
print(f"Selling Price: {self.__maxprice}")
def setMaxPrice(self, price):
self.__maxprice = price
c = Computer()
c.sell()
# Попытка изменить напрямую
c.__maxprice = 1000
c.sell()
# Использование сеттера
c.setMaxPrice(1000)
c.sell()
Вывод
Selling Price: 900 Selling Price: 900 Selling Price: 1000
Полиморфизм
Полиморфизм позволяет объектам разных классов обрабатываться через общий интерфейс, обеспечивая гибкий код, работающий с различными типами объектов.
class Parrot:
def fly(self):
print("Parrot can fly")
def swim(self):
print("Parrot can't swim")
class Penguin:
def fly(self):
print("Penguin can't fly")
def swim(self):
print("Penguin can swim")
# Общий интерфейс
def flying_test(bird):
bird.fly()
blu = Parrot()
peggy = Penguin()
flying_test(blu)
flying_test(peggy)
Вывод
Parrot can fly Penguin can't fly
Ключевые выводы
- ООП структурирует код для ясности и поддерживаемости.
- Классы позволяют переиспользование кода через наследование.
- Инкапсуляция защищает внутренние данные.
- Полиморфизм предлагает гибкие интерфейсы для разных типов объектов.
Python
- Классы и объекты в C#: Фундаменты надёжного ООП
- Освоение типов данных в Python: практическое руководство
- Мастерство операторов Python: Полное руководство
- Словари в Python: создание, манипуляции и продвинутые техники
- Пользовательские исключения в Python: практическое руководство
- Наследование в Python: концепции, синтаксис и практические примеры
- Паттерн Singleton в Java: как реализовать и безопасно использовать
- Автоматизированное визуальное отслеживание объектов на Raspberry Pi и OpenCV
- Java: объекты, классы и основные концепции ООП
- Сериализация объектов в Java: сохранение и восстановление состояния