Ответ
В 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(), который инкапсулирует логику выбора нужного класса.