Использование метода __init__

Использование метода __init__

Давайте поговорим о методе __init__ и для чего он используется в Python.

Введение

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

Метод __init__ позволяет принимать аргументы для вашего класса.

Что еще более важно, метод __init__ дает возможность назначать начальные значения различным атрибутам экземпляров класса.

Более подробно ознакомиться с классами можно в официальной документации Python.

Возьмем конкретный пример и внимательно его рассмотрим.

Создание класса

Создадим класс под названием Test

class Test:
    """
    Тестируем работу метода __init__
    """

Я могу построить новый экземпляр этого класса, вызвав его следующим образом:

class Test:
    """
    Тестируем работу метода __init__
    """


t = Test()
print(t)

Вывод программы

<main.Test object at 0x7fef0966be80>

У нас есть экземпляр класса Test, но этот класс Test на самом деле не имеет точки запуска, потому что он не имеет никакой функциональности (он не хранит никаких полезных данных или не имеет никаких методов).

Я мог бы вручную добавлять атрибуты к экземпляру класса Test, чтобы хранить на них некоторые данные, как показано ниже:

class Test:
    """
    Тестируем работу метода __init__
    """


t = Test()
t.x = 1
t.y = 0

print(t.x)
print(t.y)

Вывод программы

1
0

Но делать это было бы немного глупо.

Было бы лучше, если бы мы могли каким-то образом вызвать этот класс с аргументами для автоматического хранения атрибутов.

Использование инициализатора

Теперь, если я попытаюсь вызвать этот класс с аргументами, то мы увидим ошибку:

class Test:
    """
    Тестируем работу метода __init__
    """


t = Test(1, 0)

Вывод программы

Traceback (most recent call last):
   File "/Users/krnlnx/Projects/Test/init.py", line 7, in 
     t = Test(1, 0)
TypeError: Test() takes no arguments

Чтобы принимать аргументы, нам нужно определить метод __init__ в нашем классе:

def __init__(self, x, y):
    self.x = x
    self.y = y

Первым аргументом в нашем методе __init__ всегда будет self (как и почти во всех других методах). После этого нам нужно объявить любые аргументы, которые мы хотим, чтобы наш класс принял.

Главное, что вы почти всегда увидите в методе __init__ — это присвоение атрибутов.

Это наш новый класс Point:

class Test:
    """
    Тестируем работу метода __init__
    """

    def __init__(self, x, y):
        self.x = x
        self.y = y

Если я назову его так же, как раньше, без каких-либо аргументов, то мы увидим ошибку, потому что этот класс теперь требует двух аргументов — x и y:

class Test:
    """
    Тестируем работу метода __init__
    """

    def __init__(self, x, y):
        self.x = x
        self.y = y


t = Test()

Вывод программы

Traceback (most recent call last):
   File "/Users/krnlnx/Projects/Test/init.py", line 11, in 
     t = Test()
TypeError: init() missing 2 required positional arguments: 'x' and 'y'

Нужно дать нашему классу Test два аргумента, чтобы получить новый экземпляр этого класса:

class Test:
    """
    Тестируем работу метода __init__
    """

    def __init__(self, x, y):
        self.x = x
        self.y = y


t = Test(1, 0)

Этот объект Point теперь имеет атрибут x и атрибут y:

>> t.x
1

>> t.y
0

Это означает, что наш метод __init__ был вызван!

Заключение

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

В отличие от многих языков программирования, __init__ не называется «Методом конструктора».

Метод __init__ называется «Методом инициализатора». Метод инициализирует наш новый экземпляр класса. Таким образом, к тому моменту, когда метод инициализатора называется экземпляром класса, он уже является построенным.

Желаю удачи в программировании!

Егор Егоров

Программирую на Python с 2017 года. Люблю создавать контент, который помогает людям понять сложные вещи. Не представляю жизнь без непрерывного цикла обучения, спорта и чувства юмора.

Ссылка на мой github есть в шапке. Залетай.

Оцените автора
Егоров Егор
Добавить комментарий

  1. Алексей

    Доступно, понятно! Есть ли вариации в написании __init__?

    Ответить
    1. Егор Егоров автор

      Пожалуйста, вопрос про вариации не понял)

      Ответить