ООП Python 3 TypeError: HourlyEmployee() takes no arguments В чем именно проблема?

Везде перелазил, нигде не нашел ответа, помогайте) Как не запущу выдает ошибку

Traceback (most recent call last):
  File "c:\Users\rsupr\Desktop\papka\main.py", line 76, in <module>
    employee1 = HourlyEmployee("Иван", "Иванов", "01.01.1990", "Уборщик", 100, 40)
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: HourlyEmployee() takes no arguments

Вот сам код

# Создаем класс Employee, который будет базовым для остальных классов
class Employee:
    # Инициализируем объект класса Employee с помощью конструктора
    def init(self, first_name, last_name, birth_date, position, salary):
        self.first_name = first_name
        self.last_name = last_name
        self.birth_date = birth_date
        self.position = position
        self.salary = salary

# Создаем класс HourlyEmployee, который будет наследоваться от класса Employee
class HourlyEmployee(Employee):
    # Инициализируем объект класса HourlyEmployee с помощью конструктора
    def init(self, first_name, last_name, birth_date, position, salary_rate, hours_worked):
        # Вызываем конструктор родительского класса с помощью super()
        super().init(first_name, last_name, birth_date, position, salary_rate * hours_worked)

# Создаем класс SalariedEmployee, который будет наследоваться от класса Employee
class SalariedEmployee(Employee):
    # Инициализируем объект класса SalariedEmployee с помощью конструктора
    def init(self, first_name, last_name, birth_date, position, annual_income):
        # Вызываем конструктор родительского класса с помощью super()
        super().init(first_name, last_name, birth_date, position, annual_income / 12)

# Создаем класс HiredEmployee, который будет наследоваться от класса Employee
class HiredEmployee(Employee):
    # Инициализируем объект класса HiredEmployee с помощью конструктора
    def init(self, first_name, last_name, birth_date, position, annual_income):
        # Вызываем конструктор родительского класса с помощью super()
        super().init(first_name, last_name, birth_date, position, annual_income / 12)

# Создаем класс Manager, который будет наследоваться от класса HiredEmployee
class Manager(HiredEmployee):
    # Инициализируем объект класса Manager с помощью конструктора
    def init(self, first_name, last_name, birth_date, position, annual_income, sales_percentage):
        # Вызываем конструктор родительского класса с помощью super() и учитываем процент от продаж
        super().init(first_name, last_name, birth_date, position, annual_income + (annual_income * sales_percentage))

# Создаем класс Executive, который будет наследоваться от класса HiredEmployee
class Executive(HiredEmployee):
    # Инициализируем объект класса Executive с помощью конструктора
    def init(self, first_name, last_name, birth_date, position, annual_income, bonus):
        # Вызываем конструктор родительского класса с помощью super() и учитываем бонус
        super().init(first_name, last_name, birth_date, position, annual_income + bonus)

# Создаем класс Company
class Company:
    # Инициализируем объект класса Company с помощью конструктора
    def init(self):
        self.employees = []

    # Метод hire() для найма нового сотрудника
    def hire(self, employee):
        self.employees.append(employee)

    # Метод fire() для увольнения сотрудника
    def fire(self, employee):
        self.employees.remove(employee)

    # Метод promote() для повышения должности и зарплаты сотрудника
    def promote(self, employee, new_position, new_salary):
        employee.position = new_position
        employee.salary = new_salary

    # Метод calculate_salaries() для подсчета общей зарплаты сотрудников
    def calculate_salaries(self):
        total_salary = 0
        for employee in self.employees:
            total_salary += employee.salary
        return total_salary

# Создаем объект класса Company
company = Company()

# Создаем объекты классов HourlyEmployee, SalariedEmployee, Manager и Executive
employee1 = HourlyEmployee("Иван", "Иванов", "01.01.1990", "Уборщик", 100, 40)
employee2 = SalariedEmployee("Петр", "Петров", "02.02.1991", "Программист", 50000)
employee3 = Manager("Сидор", "Сидоров", "03.03.1992", "Менеджер по продажам", 100000, 0.05)
employee4 = Executive("Алексей", "Алексеев", "04.04.1993", "Генеральный директор", 1000000, 50000)

# Нанимаем новых сотрудников
company.hire(employee1)
company.hire(employee2)
company.hire(employee3)
company.hire(employee4)

# Выводим общую зарплату сотрудников
print(company.calculate_salaries())

# Увольняем одного из сотрудников
company.fire(employee1)

# Выводим общую зарплату сотрудников после увольнения
print(company.calculate_salaries())

# Повышаем должность и зарплату одного из сотрудников
company.promote(employee2, "Ведущий программист", 75000)

# Выводим общую зарплату сотрудников после повышения
print(company.calculate_salaries())

Ответы (1 шт):

Автор решения: Danila Kartovitskii

В Python метод-конструктор должен называться __init__ (с двумя подчеркиваниями в начале и в конце имени метода)

Вот рабочий вариант кода:

# Создаем класс Employee, который будет базовым для остальных классов
class Employee:
    # Инициализируем объект класса Employee с помощью конструктора
    def init(self, first_name, last_name, birth_date, position, salary):
        self.first_name = first_name
        self.last_name = last_name
        self.birth_date = birth_date
        self.position = position
        self.salary = salary

# Создаем класс HourlyEmployee, который будет наследоваться от класса Employee
class HourlyEmployee(Employee):
    # Инициализируем объект класса HourlyEmployee с помощью конструктора
    def __init__(self, first_name, last_name, birth_date, position, salary_rate, hours_worked):
        # Вызываем конструктор родительского класса с помощью super()
        super().init(first_name, last_name, birth_date, position, salary_rate * hours_worked)

# Создаем класс SalariedEmployee, который будет наследоваться от класса Employee
class SalariedEmployee(Employee):
    # Инициализируем объект класса SalariedEmployee с помощью конструктора
    def __init__(self, first_name, last_name, birth_date, position, annual_income):
        # Вызываем конструктор родительского класса с помощью super()
        super().init(first_name, last_name, birth_date, position, annual_income / 12)

# Создаем класс HiredEmployee, который будет наследоваться от класса Employee
class HiredEmployee(Employee):
    # Инициализируем объект класса HiredEmployee с помощью конструктора
    def __init__(self, first_name, last_name, birth_date, position, annual_income):
        # Вызываем конструктор родительского класса с помощью super()
        super().init(first_name, last_name, birth_date, position, annual_income / 12)

# Создаем класс Manager, который будет наследоваться от класса HiredEmployee
class Manager(HiredEmployee):
    # Инициализируем объект класса Manager с помощью конструктора
    def __init__(self, first_name, last_name, birth_date, position, annual_income, sales_percentage):
        # Вызываем конструктор родительского класса с помощью super() и учитываем процент от продаж
        super().init(first_name, last_name, birth_date, position, annual_income + (annual_income * sales_percentage))

# Создаем класс Executive, который будет наследоваться от класса HiredEmployee
class Executive(HiredEmployee):
    # Инициализируем объект класса Executive с помощью конструктора
    def __init__(self, first_name, last_name, birth_date, position, annual_income, bonus):
        # Вызываем конструктор родительского класса с помощью super() и учитываем бонус
        super().init(first_name, last_name, birth_date, position, annual_income + bonus)

# Создаем класс Company
class Company:
    # Инициализируем объект класса Company с помощью конструктора
    def __init__(self):
        self.employees = []

    # Метод hire() для найма нового сотрудника
    def hire(self, employee):
        self.employees.append(employee)

    # Метод fire() для увольнения сотрудника
    def fire(self, employee):
        self.employees.remove(employee)

    # Метод promote() для повышения должности и зарплаты сотрудника
    def promote(self, employee, new_position, new_salary):
        employee.position = new_position
        employee.salary = new_salary

    # Метод calculate_salaries() для подсчета общей зарплаты сотрудников
    def calculate_salaries(self):
        total_salary = 0
        for employee in self.employees:
            total_salary += employee.salary
        return total_salary

# Создаем объект класса Company
company = Company()

# Создаем объекты классов HourlyEmployee, SalariedEmployee, Manager и Executive
employee1 = HourlyEmployee("Иван", "Иванов", "01.01.1990", "Уборщик", 100, 40)
employee2 = SalariedEmployee("Петр", "Петров", "02.02.1991", "Программист", 50000)
employee3 = Manager("Сидор", "Сидоров", "03.03.1992", "Менеджер по продажам", 100000, 0.05)
employee4 = Executive("Алексей", "Алексеев", "04.04.1993", "Генеральный директор", 1000000, 50000)

# Нанимаем новых сотрудников
company.hire(employee1)
company.hire(employee2)
company.hire(employee3)
company.hire(employee4)

# Выводим общую зарплату сотрудников
print(company.calculate_salaries())

# Увольняем одного из сотрудников
company.fire(employee1)

# Выводим общую зарплату сотрудников после увольнения
print(company.calculate_salaries())

# Повышаем должность и зарплату одного из сотрудников
company.promote(employee2, "Ведущий программист", 75000)

# Выводим общую зарплату сотрудников после повышения
print(company.calculate_salaries())
→ Ссылка