Может ли класс в Python иметь несколько методов __init__?

«Может ли класс в Python иметь несколько методов __init__?» — вопрос из категории Python, который задают на 33% собеседований Data Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет, в Python класс не может иметь несколько методов __init__. Если определить несколько методов с таким именем, последний переопределит предыдущие, и будет использоваться только он.

Однако существует несколько паттернов для реализации альтернативных конструкторов:

  1. *Аргументы по умолчанию и `args/kwargs`: Позволяют создавать объекты с разным набором параметров в одном методе __init__.

    class Point:
        def __init__(self, x, y=0):
            self.x = x
            self.y = y
    
    p1 = Point(5)      # y будет 0
    p2 = Point(3, 4)
  2. Методы класса (@classmethod): Это стандартный и рекомендуемый способ создания "фабричных" методов, которые возвращают новый экземпляр класса.

    class User:
        def __init__(self, name: str, age: int):
            self.name = name
            self.age = age
    
        @classmethod
        def from_birth_year(cls, name: str, birth_year: int) -> 'User':
            """Альтернативный конструктор: создаёт User по году рождения."""
            from datetime import datetime
            current_year = datetime.now().year
            age = current_year - birth_year
            return cls(name, age)
    
        @classmethod
        def from_dict(cls, data: dict) -> 'User':
            """Ещё один конструктор: создаёт User из словаря."""
            return cls(data['name'], data['age'])
    
    # Использование
    user1 = User("Alice", 30)
    user2 = User.from_birth_year("Bob", 1994)
    user3 = User.from_dict({"name": "Charlie", "age": 25})

Таким образом, хотя прямой перегрузки __init__ нет, гибкость языка Python позволяет легко реализовать необходимое поведение через классовые методы.