← Назад к вопросам

Что знаешь о ООП в Python?

1.2 Junior🔥 171 комментариев
#Python Core#Архитектура и паттерны

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# ООП в 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

Практическое применение

Преимущества ООП:

  • Модульность и переиспользуемость кода
  • Лучшая организация больших проектов
  • Изоляция данных и логики
  • Упрощение тестирования

Когда использовать:

  • Сложные приложения с множеством взаимодействующих компонентов
  • Библиотеки и фреймворки
  • Долгоживущие проекты

Когда минимизировать:

  • Простые скрипты (функциональное программирование может быть лучше)
  • Очень маленькие утилиты

Питон поддерживает как ООП, так и функциональное программирование, позволяя выбирать инструменты, которые лучше всего подходят для задачи.