Класс Python
Почти всё в Python можно назвать объектом. И у каждого объекта, естественно, есть свои характеристики, свойства и функции.
Мы можем считать класс неким «макетом» для создания объектов. Точнее сказать — нашим собственным специально настраиваемым макетом. А раз мы сами под себя его настраиваем, то и задавать ему можем любые характеристики, свойства и функции!
Начнём с простого примера. Создадим класс со свойством «x», где x=10. Вот определение нашего класса:
class my_class:
x = 10
Вот и всё! Мы создали наш первый класс Python my_class
со свойством x
и значением 10. Чтобы использовать класс, вызываем нашу функцию. Дальше мы можем обращаться к любым свойствам класса по отдельности.
class my_class:
x = 10
c_1 = my_class()
print(c_1.x)
Данный код выводит число 10. Всё просто!
Ещё мы можем поменять переменную, просто присвоив ей новое значение. Вместо того, чтобы x
был равен 10, пусть он равняется строке «Bob».
class my_class:
x = 10
c_1 = my_class()
c_1.x = "Bob"
print(c_1.x)
Создадим класс под названием 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 Источник: https://egorovegor.ru/python-init-method
Чтобы принимать аргументы, нам нужно определить метод 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) # два аргумента print(t.x) print(t.y)
Этот объект Point теперь имеет атрибут x и атрибут y:
Пример:
У всех классов есть функция __init__()
. Её можно менять в любое время. Функция __init__()
выполняется всякий раз, когда из класса создаётся объект. Она может использоваться для инициализации переменных класса. __init__()
становится очень полезной, когда нам нужно, чтобы класс Python всегда начинался с тех или иных свойств.
В качестве примера возьмём следующий код:
class Person:
def __init__(self, name, gender):
self.name = name
self.gender = gender
self.country = "USA"
person_1 = Person("Bob", "Male")
person_2 = Person("Kate", "Female")
print(person_1.name)
print(person_1.gender)
print(person_1.country)
print(person_2.name)
print(person_2.gender)
print(person_2.country)
Здесь у нас есть два человека с классом Person и именами Bob и Kate (типа мы их создали). В обоих классах исполнялась функция __init__()
, инициализируя переменные класса для имени, пола и страны человека.
Что касается имени и пола, мы передали классу свои переменные, которые требовались в __init__()
. Переменная «страна» инициализировалась при создании объекта в этой же функции, но с одним отличием: по причине того, что она не является переменной функции __init__()
, значение не может быть задано извне. Поэтому у всех будет одна страна — США.
Результат этого кода будет такой:
Bob
Male
USA
Kate
Female
USA
Когда вы создаете новый класс в Python, первым методом, который вы, скорее всего, создадите, будет метод __init__
Метод __init__ позволяет принимать аргументы для вашего класса.
Что еще более важно, метод __init__ дает возможность назначать начальные значения различным атрибутам экземпляров класса.
Конструктор — это функция класса, которая создает объект с предопределенными значениями. Он начинается с двойного подчеркивания (_). Это метод __init__()
ПРИМЕЧАНИЕ: об использовании в Python «self» Аргумент «self» относится к самому объекту. Отсюда и использование слова «self». Таким образом, внутри этого метода self будет ссылаться на конкретный экземпляр этого объекта, с которым работает.
Self — это имя, предпочитаемое соглашением Pythons для обозначения первого параметра методов экземпляра в Python. Это часть синтаксиса Python для доступа к членам объектов