Что знаешь о ООП в Python?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
# ООП в Python
Питон предоставляет полнофункциональную реализацию объектно-ориентированного программирования. Это один из столпов языка, позволяющий создавать модульный, переиспользуемый и легко тестируемый код.
Основные концепции
1. Классы и объекты
Класс — это чертёж для создания объектов, описывающий их структуру и поведение:
class Dog:
# Атрибут класса
species = "Canis familiaris"
# Конструктор
def __init__(self, name: str, age: int):
self.name = name # Атрибут экземпляра
self.age = age
def bark(self) -> str:
return f"{self.name} says Woof!"
def __str__(self) -> str:
return f"Dog(name={self.name}, age={self.age})"
# Создание объекта
dog = Dog("Rex", 3)
print(dog.bark()) # Rex says Woof!
print(dog.species) # Canis familiaris
2. Принцип наследования (Inheritance)
Наследование позволяет классу получить свойства и методы другого класса:
class Animal:
def __init__(self, name: str):
self.name = name
def make_sound(self) -> str:
return "Some sound"
class Cat(Animal):
def make_sound(self) -> str:
return f"{self.name} says Meow!"
class Bird(Animal):
def make_sound(self) -> str:
return f"{self.name} says Tweet!"
# Полиморфизм
animals = [Cat("Whiskers"), Bird("Tweety")]
for animal in animals:
print(animal.make_sound()) # Используем один интерфейс для разных типов
3. Инкапсуляция (Encapsulation)
Привилегии доступа контролируют видимость данных:
class BankAccount:
def __init__(self, balance: float):
self._balance = balance # Protected (условно приватный)
def deposit(self, amount: float) -> None:
if amount > 0:
self._balance += amount
def get_balance(self) -> float:
return self._balance
account = BankAccount(1000)
account.deposit(500)
print(account.get_balance()) # 1500
Питон использует соглашение о наименовании (по наведению руки): одно подчёркивание (_) означает "используй осторожно", два (__) вызывают name mangling.
4. Полиморфизм (Polymorphism)
Разные объекты отвечают одним методам по-разному:
class Shape:
def area(self) -> float:
raise NotImplementedError
class Circle(Shape):
def __init__(self, radius: float):
self.radius = radius
def area(self) -> float:
return 3.14159 * self.radius ** 2
class Rectangle(Shape):
def __init__(self, width: float, height: float):
self.width = width
self.height = height
def area(self) -> float:
return self.width * self.height
def print_area(shape: Shape) -> None:
print(f"Area: {shape.area()}")
print_area(Circle(5)) # Работает с Circle
print_area(Rectangle(4, 6)) # Работает с Rectangle
5. Абстрактные классы и интерфейсы
from abc import ABC, abstractmethod
class Database(ABC):
@abstractmethod
def connect(self) -> None:
pass
@abstractmethod
def query(self, sql: str) -> list:
pass
class PostgreSQL(Database):
def connect(self) -> None:
print("Connecting to PostgreSQL")
def query(self, sql: str) -> list:
print(f"Executing: {sql}")
return []
# Database() # TypeError: Can't instantiate abstract class
db = PostgreSQL()
db.connect()
6. Свойства (Properties)
Используются декоратор @property для создания управляемых атрибутов:
class Circle:
def __init__(self, radius: float):
self._radius = radius
@property
def radius(self) -> float:
return self._radius
@radius.setter
def radius(self, value: float) -> None:
if value <= 0:
raise ValueError("Radius must be positive")
self._radius = value
@property
def area(self) -> float:
return 3.14159 * self._radius ** 2
c = Circle(5)
print(c.area) # 78.5975
c.radius = 10 # Использует setter
Практическое применение
Преимущества ООП:
- Модульность и переиспользуемость кода
- Лучшая организация больших проектов
- Изоляция данных и логики
- Упрощение тестирования
Когда использовать:
- Сложные приложения с множеством взаимодействующих компонентов
- Библиотеки и фреймворки
- Долгоживущие проекты
Когда минимизировать:
- Простые скрипты (функциональное программирование может быть лучше)
- Очень маленькие утилиты
Питон поддерживает как ООП, так и функциональное программирование, позволяя выбирать инструменты, которые лучше всего подходят для задачи.