Может ли метод класса в ООП возвращать другой класс или его экземпляр

«Может ли метод класса в ООП возвращать другой класс или его экземпляр» — вопрос из категории ООП, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, метод класса может возвращать как сам класс (объект типа type), так и экземпляр другого (или текущего) класса. Это ключевая концепция для реализации таких паттернов, как Фабричный метод или Строитель.

Возвращение экземпляра позволяет делегировать создание сложных объектов, а возвращение класса — предоставить вызывающему коду возможность самому создать экземпляр.

Пример (Python)

В этом примере ShapeFactory.create_shape в зависимости от аргумента возвращает экземпляр одного из подклассов Shape.

from abc import ABC, abstractmethod

# Абстрактный базовый класс
class Shape(ABC):
    @abstractmethod
    def draw(self):
        pass

# Конкретные реализации
class Circle(Shape):
    def draw(self):
        print("Рисуем круг")

class Square(Shape):
    def draw(self):
        print("Рисуем квадрат")

# Фабричный метод
class ShapeFactory:
    @staticmethod
    def create_shape(shape_type: str) -> Shape:
        """Создает и возвращает экземпляр нужной фигуры."""
        if shape_type == 'circle':
            return Circle()
        if shape_type == 'square':
            return Square()
        raise ValueError(f"Неизвестный тип фигуры: {shape_type}")

# Использование
circle_obj = ShapeFactory.create_shape('circle')
circle_obj.draw()  # Вывод: Рисуем круг

Ключевые моменты:

  • Гибкость: Позволяет системе легко добавлять новые типы продуктов (фигур), не изменяя код, который их создает.
  • Инкапсуляция: Логика создания объектов скрыта внутри фабричного метода.