Существует ли в Python концепция виртуального конструктора

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

Ответ

В Python нет прямого аналога "виртуального конструктора", как в C++, но задача полиморфного создания объектов решается с помощью паттерна Фабричный метод (Factory Method).

Причина в том, что в Python все методы по умолчанию являются "виртуальными" (их можно переопределить в подклассах), поэтому фокус смещается с вызова конструктора на делегирование создания объекта специальному методу.

Реализация через фабричный метод:

Фабричный метод — это, как правило, метод класса (@classmethod), который в зависимости от входных параметров решает, экземпляр какого подкласса нужно создать.

from abc import ABC, abstractmethod

class Animal(ABC):
    @abstractmethod
    def speak(self):
        pass

    # Это и есть наш "виртуальный конструктор" или фабричный метод
    @classmethod
    def create(cls, animal_type: str):
        if animal_type == "dog":
            return Dog()
        elif animal_type == "cat":
            return Cat()
        raise ValueError(f"Неизвестный тип животного: {animal_type}")

class Dog(Animal):
    def speak(self):
        return "Woof!"

class Cat(Animal):
    def speak(self):
        return "Meow!"

# Клиентский код не зависит от конкретных классов Dog или Cat
animal1 = Animal.create("dog")
animal2 = Animal.create("cat")

print(f"Создан объект типа {type(animal1).__name__}, он говорит: {animal1.speak()}")
# Вывод: Создан объект типа Dog, он говорит: Woof!

print(f"Создан объект типа {type(animal2).__name__}, он говорит: {animal2.speak()}")
# Вывод: Создан объект типа Cat, он говорит: Meow!

Ключевая идея: Вместо прямого вызова конструктора (Dog()) мы делегируем создание объекта методу Animal.create(), который инкапсулирует логику выбора нужного класса.