Как передать параметры при создании объекта класса в Python?

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

Ответ

В Python параметры для инициализации объекта передаются в его специальный метод __init__, который является инициализатором (часто его называют конструктором).

Когда вы создаете экземпляр класса, например my_obj = MyClass(arg1, arg2), Python автоматически вызывает MyClass.__init__(my_obj, arg1, arg2), где my_obj передается в первый аргумент self.

Основной пример

class User:
    # Метод-инициализатор
    def __init__(self, username: str, email: str):
        print(f"Создание нового пользователя {username}...")
        # Присваивание параметров атрибутам экземпляра
        self.username = username
        self.email = email
        self.is_active = True # Атрибут со значением по умолчанию

# Создание экземпляра (объекта) с передачей параметров
user1 = User("alice", "alice@example.com")

print(user1.username)  # Вывод: alice
print(user1.is_active) # Вывод: True

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

  • self: Первый параметр (self) всегда ссылается на сам создаваемый экземпляр. Он передается неявно и позволяет внутри метода обращаться к атрибутам и методам объекта (например, self.username).

  • Аргументы по умолчанию: Как и в обычных функциях, в __init__ можно задавать значения по умолчанию: def __init__(self, username, role='guest'):.

  • Позиционные и именованные аргументы: Параметры можно передавать как позиционно (User('bob', 'bob@a.com')), так и по имени (User(email='bob@a.com', username='bob')), что повышает читаемость кода.

  • Наследование: В дочерних классах для инициализации атрибутов родительского класса необходимо вызывать его инициализатор через super().__init__(...).

class Admin(User):
    def __init__(self, username, email, access_level):
        # Вызов __init__ родительского класса User
        super().__init__(username, email)
        self.access_level = access_level

admin = Admin("root", "root@system.local", 5)
print(admin.username)     # Вывод: root
print(admin.access_level) # Вывод: 5