Как передать параметры при создании объекта класса в 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

Ответ 18+ 🔞

Ага, слушай, вот этот твой вопрос про __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 нужен!
        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.username). Без него — нихуя не работает, запомни.

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

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

  • Наследование: А вот это, блядь, важно! Если делаешь дочерний класс, то чтобы не потерять атрибуты родителя, надо вызвать его __init__ через super().__init__(...). Иначе получишь объект-полупидора, у которого половины свойств нет!

class Admin(User):
    def __init__(self, username, email, access_level):
        # Вызываем __init__ родительского класса User, чтобы username и email проинициализировались
        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

Вот и вся магия, блядь. Ничего сложного, главное — понять, что self это не какая-то хуйня, а сам объект, который собирается жить. А __init__ — это его первая команда "на старт, внимание, марш!".