- 20.06.2022
- 27 009
- 230
- 36
- Награды
- 10
- Пол
- Муж.
Репутация:
- Автор темы
- Администратор
- Модератор
- Команда форума
- #1

Сегодня мы разберемся подробнее в классах, так как у многих junior программистов python возникают проблемы в них. Так же отдельно затронем интересную тему, что такое *args и **kwargs. Почему эти темы трудные? Все связано с тем, что на начальном уровне программирования нам не требуется строить громоздкие конструкции по взаимодействию с чем-либо. Обычно мы о ограничиваемся скриптами без собственных классов. Или же создаем объекты классов из библиотек и не задумываемся, а что там внутри. Сегодня мы взглянем, как можно кастомизировать под себя класс и добавить нужный нам функционал под конкретную задачу на примере взаимодействия с mongo bd.
Что потребуется
- Компьютер или любая другая ЭВМ
- Редактор кода
- Python версии 3.9 и выше
- Соединение с интернетом (можно и без него)
Установка
Установка для windows
- pip install pymongo
- pip3 install pymongo
Знакомство с классами
И что ж мы начнем разбираться. Для чего нужен класс? Он нужен для создания объектов, с определенными фикциями и данными внутри. То есть класс нам упрощает жизнь. Если у нас есть какой-либо функционал взаимодействия с чем-либо и для этого надо много функций, которые мы постоянно вызываем и передаем в них значения, то следует объединить их все (функции) в один объект.
Пример:
Взаимодействие с БД (базой данных). Нам надо в начале к ней подключится. Потом найти нужную нам таблицу. Потом сделать поиск значений по каким-то параметрам. И после этого вывести полученные значения. А у нас может быть еще и запись, и редактирование, и создание, и удаление и так далее. Через какое-то время нам надоест руками перебирать все функции для работы с БД (там может быть много этапов).
Вот тут и вступает в игру классы. Рассмотрим на примере кода:
Python:
class Person:
def __init__(self, sex: str):
self.sex = sex
self.gender = 'heterosexual'
self.age = 0
print('I was born')
def change_gender(self, preferred_gender: str):
self.gender = preferred_gender
def describe_the_action(self, action: str):
print('I do ', action)
def __del__(self):
print('I am dead')
Обратим внимание на то, что в python принято записывать имя класса с заглавной буквы. Сразу следует уточнить, что функции и переменные называются в классах по-другому. Функция – это метод, а переменное – это поле.
Метод __init__ - это конструктор, то есть вызывается при создание объекта. То есть как только мы создадим его то нам выведется ‘I was born’. Все методы принимают обязательный элемент self он указывает, что мы обращаемся именно к этому объекту, а не к какому-то другом (красочный пример ). У нашей персоны будет его пол, гендер (стандартный при рождение) и возраст (изначально он будет равен 0).Дальше передаем аргументы.
Теперь не много о полях. Они распознаются обращением к self и через точку название поля.
Метод __del__ - это деконструктор, который срабатывает когда объект уничтожается (вызов del object или завершение скрипта).
Так же добавим свой собственный метод, который будет выводить что делает человек и изменение гендера персоны.
Python:
person = Person('male')
Давайте теперь посмотрим, что выведется и попробуем изменить
Python:
print('gender:', person.gender)
person.change_gender('cat')
print('gender:', person.gender)
- I was born
- gender: heterosexual
- gender: cat
- I am dead
Тут мы можем пронаблюдать, что все работает корректно. Предлагаю вам самостоятельно поиграться классом персон.
Наследование класса
Теперь мы взглянем, как наследоваться от другого класса.
Python:
class Ivan(Person):
def __init__(self, sex: str, name: str):
super().__init__(sex)
self.name = name
Для наследования мы после названия класса пишем в скобки класс, от которого мы хотим наследоваться. Мы унаследуем все методы и поля, которые есть у родителя. Так же надо принять инициализацию класса родителя. С этим на поможет super().__init__(sex). После для Ивана мы сохраняем имя.
Python:
man = Ivan('male', 'Ivan')
print('gender:', man.gender)
man.change_gender('cat')
print('gender:', man.gender)
Вывод в консоль:
- I was born
- gender: heterosexual
- gender: cat
- I am dead
Чуть не забыл, что обращаться к полям класса можно через точку. Пример:
Python:
print(man.name)
Вывод в консоль
- Ivan
Что это такое и с чем это едят? Для того, чтобы объяснить потребуется пример.
*args
Тут не важно какое будет название у аргумента, главное — это оператор звёздочка, которая говорит python, что все следующие аргументы передавать в *args
Python:
def args(first, second, *other):
print('first:', first)
print('second:', second)
print('other:', other)
print(type(other))
args(1, 2, 3, 4, 5, 6, 7, 8)
Давайте, посмотрим перед объяснение, что выведется в консоль
Вывод в консоль
- first: 1
- second: 2
- other: (3, 4, 5, 6, 7, 8)
- <class 'tuple'>
Теперь мы видим что первые аргументы поступающие в функцию имеют свое название first, second, а все остальные попалили в кортеж (typle). К other обращаться по индекс и все обычными способами (подробнее о tuple ).
Что будет если мы не передадим в other никаких аргументов?
Python:
args(1, 2)
- first: 1
- second: 2
- other: ()
- <class 'tuple'>
**kwargs
Python:
def kwargs(first, second, **other):
print('first:', first)
print('second:', second)
print('other:', other)
print(type(other))
kwargs(1, 2, nums=[1, 2, 3, 3], string='text', dict={'key': 'value'})
У вам может возникнуть вопрос, что за новые аргументы nums, string и dict? Давайте, запустим и посмотрим
Вывод в консоль
- first: 1
- second: 2
- other: {'nums': [1, 2, 3, 3], 'string': 'text', 'dict': {'key': 'value'}}
- <class 'dict'>
Удивительно, но other стал словарем с ключами в виде название аргументов. Как мы видим туда можно передавать любое количество аргументов со значением и получать словарь из них.
Так же взглянем если туда не передавать значения
Python:
kwargs(1, 2)
Вывод в консоль
- first: 1
- second: 2
- other: {}
- <class 'dict'>
Как видите ошибок нет и у нас просто пустой массив.
Заключение
Темы не просты в освоение, поэтому я могу лишь надеется, что вы поймете. Так как я пытался максимально понятно объяснить, но передать то, что просто понимаешь достаточно трудно. Чтобы понять и закрепить материал для вас я рекомендую самостоятельно поиграться с классами и args, и kwargs. Желательно на каком-то проекте, чтобы применить знания в «стрессовой ситуации».
Последние темы в этом разделе:
- [Сергей Спирёв] [Stepik] Библиотека Seaborn. Статистическая визуализация данных в Python (2025)
- [А.Ерошенко, Л.Данилова и др.] Курс по автоматизации тестирования на JavaScript + Playwright (2025)
- [Михаил Крыжановский] [Stepik] Телеграм-боты на Python: продвинутый уровень (2024)
- [IT Start] Курс по Python 3 (2024)
- [А. Ерошенко, С. Хомутинин, С. Васенков] Автоматизация тестирования на Python (2024)
- [IT Start] Создание графического интерфейса в Python 3 с Tkinter (2024)
- [Дмитрий Лаврик] PHP – ООП (2021)
- Параллелизм в Python. Заметка на русском с примерами кода.
- Крутая, содержательная шпаргалка с примерами по веб-фреймворку Django
- Асинхронный Python и Asyncio - Молчанов (2023)