Конструктор класса – метод __init__
В объектно-ориентированном программировании конструктором класса называют метод, который автоматически вызывается при создании объектов. Его также можно назвать конструктором объектов класса. Имя такого метода обычно регламентируется синтаксисом конкретного языка программирования. Так в Java имя конструктора класса совпадает с именем самого класса. В Python же роль конструктора играет метод __init__ .
В Python наличие пар знаков подчеркивания спереди и сзади в имени метода говорит о том, что он принадлежит к группе методов перегрузки операторов. Если подобные методы определены в классе, то объекты могут участвовать в таких операциях как сложение, вычитание, вызываться как функции и др.
При этом методы перегрузки операторов не надо вызывать по имени. Вызовом для них является сам факт участия объекта в определенной операции. В случае конструктора класса – это операция создания объекта. Так как объект создается в момент вызова класса по имени, то в этот момент вызывается метод __init__ .
Необходимость конструкторов связана с тем, что нередко объекты должны иметь собственные свойства сразу. Пусть имеется класс Person , объекты которого обязательно должны иметь имя и фамилию. Если класс будет описан подобным образом
class Person: def set_name(self, n, s): self.name = n self.surname = s
то создание объекта возможно без полей. Для установки имени и фамилии метод set_name нужно вызывать отдельно:
>>> from test import Person >>> p1 = Person() >>> p1.set_name("Bill", "Ross") >>> p1.name, p1.surname ('Bill', 'Ross')
В свою очередь, конструктор класса не позволит создать объект без обязательных полей:
class Person: def __init__(self, n, s): self.name = n self.surname = s p1 = Person("Sam", "Baker") print(p1.name, p1.surname)
Здесь при вызове класса в круглых скобках передаются значения, которые будут присвоены параметрам метода __init__ . Первый его параметр – self – ссылка на сам только что созданный объект.
Теперь, если мы попытаемся создать объект, не передав ничего в конструктор, то будет возбуждено исключение, и объект не будет создан:
>>> p1 = Person() Traceback (most recent call last): File "", line 1, in TypeError: __init__() missing 2 required positional arguments: 'n' and 's'
Однако бывает, что надо допустить создание объекта, даже если никакие данные в конструктор не передаются. В таком случае параметрам конструктора класса задаются значения по умолчанию:
class Rectangle: def __init__(self, w=0.5, h=1): self.width = w self.height = h def square(self): return self.width * self.height rec1 = Rectangle(5, 2) rec2 = Rectangle() rec3 = Rectangle(3) rec4 = Rectangle(h=4) print(rec1.square()) print(rec2.square()) print(rec3.square()) print(rec4.square())
10 0.5 3 2.0
Если класс вызывается без значений в скобках, то для параметров будут использованы их значения по умолчанию. Однако поля width и height будут у всех объектов.
Кроме того, конструктору вовсе не обязательно принимать какие-либо параметры, не считая self .
В других языка программирования, например в Java, классы могут содержать несколько конструкторов, которые между собой отличаются количеством параметром, а также, возможно, их типом. При создании объекта срабатывает тот конструктор, количество и типы параметров которого совпали с количеством и типами переданных в конструктор аргументов.
В Python создать несколько методов __init__ в классе можно, однако «рабочим» останется только последний. Он переопределит ранее определенные. Поэтому в Python в классах используется только один конструктор, а изменчивость количества передаваемых аргументов настраивается через назначение значений по-умолчанию.
Практическая работа. Конструктор и деструктор
Помимо конструктора объектов в языках программирования есть обратный ему метод – деструктор. Он вызывается, когда объект не создается, а уничтожается.
Это не значит, что сам деструктор уничтожает объект. В теле самого метода нет никаких инструкций по удалению экземпляра. Непосредственное удаление выполняется автоматически так называемым сборщиком мусора.
Деструктор (финализатор) в коде вашего класса следует использовать, когда при удалении объекта необходимо выполнить ряд сопутствующий действий, например, отправить сообщение, закрыть файл, разорвать соединение с базой данных.
В языке программирования Python объект уничтожается, когда исчезают все связанные с ним переменные или им присваивается другое значение, в результате чего связь со старым объектом теряется. Удалить переменную можно с помощью команды языка del . Также все объекты уничтожаются, когда программа завершает свою работу.
В классах Python функцию деструктора выполняет метод __del__ .
Напишите программу по следующему описанию:
- Есть класс Person , конструктор которого принимает три параметра (не учитывая self ) – имя, фамилию и квалификацию специалиста. Квалификация имеет значение заданное по умолчанию, равное единице.
- У класса Person есть метод, который возвращает строку, включающую в себя всю информацию о сотруднике.
- Класс Person содержит деструктор, который выводит на экран фразу «До свидания, мистер …» (вместо троеточия должны выводиться имя и фамилия объекта).
- В основной ветке программы создайте три объекта класса Person . Посмотрите информацию о сотрудниках и увольте самое слабое звено.
- В конце программы добавьте функцию input() , чтобы скрипт не завершился сам, пока не будет нажат Enter . Иначе вы сразу увидите как удаляются все объекты при завершении работы программы.
Курс с примерами решений практических работ:
pdf-версия
X Скрыть Наверх
Объектно-ориентированное программирование на Python
Плагины, горячие клавиши, настройки для PyCharm
Всем привет! Перед самим списком плагинов, горячих клавиш и т. п. небольшой дисклеймер.
Думаю каждый разработчик хоть раз встаёт перед трудным вопросом: Где и как писать код? Многие «тру» программисты тут же ответят: VIM NVIM и другие консольные редакторы. Но мы то с вами нормальные люди и хотим разрабатывать с удобством и комфортом. Хотим облегчить процесс кодинга.
Именно поэтому, многие программисты и отдают предпочтение ide’шкам, а не консольным редакторам.
После установки любой современной ide, у вас наверняка наступает ощущение абсолютной радости (особенно, если вы раньше вообще не программировали). Но после первых пары дней, вы узнаете о такой потрясающей вещи как плагины. Да. Это то, что может сделать опыт работы с ide ещё более простым, понятным, комфортным.
Когда я только начинал свой путь в разработке, я решил использовать PyCharm (соотвественно, для разработки на Python). И по моему глубокому убеждению не прогадал. PyCharm относительно лёгкая, относительно минималистичная ide’шка. Но не смотря на это, PyCharm — мощнейший инструмент для написания кода. Всё, начиная от подсветки синтаксиса и подсказок типов и заканчивая возможностью делать рефакторинг за одно сочетание клавиш, приводить весь код к единому стандарту, подключаться к базе данных и FTP/SSH, всё это может делать наш горячо любимый PyCharm.
Так зачем же тогда такому прекрасному редактору ещё и плагины? Всё очень просто, плагины позволяют нам добавить узкоспециализированные фичи, который просто не помещаются в стандартную «библиотеку» PyCharm.

Но в интернете практически нет статей посвящённых набору крутых плагинов, такие статьи разбросаны по всему интернету и найти в них ценный материал крайне сложно, поэтому, надеюсь, эта статья и станет своего рода базой, единым топом крутых плагинов для наших любых ide от JetBrains и для PyCharm в частности.
Итак, начнём с плагинов, я буду перечислять их примерно отсортировав по степени важности (по моему мнению).
Топ плагинов для PyCharm:
- Tabnine — подсказки с использованием ИИ. Очень крутой плагин, сильно помогает при написании кода, использую всегда.
- Translation — супер полезный плагин, позволяет запустить переводчик прямо из кода. Использование: выделить нужный текст, нажать ПКМ и выбрать Translate/Translate and Repace. Либо нажать в правом верхнем углу на иконку перевода.
- PyLint — линтер для Python, указывает на плохой код. Использование: выбрать в нижнем меню PyLint и запустить проверку.
- MyPy — проверка типов в Python (чтобы не допускать ошибки связанные с типом возвращаемых значений). Использование: выбрать в нижнем меню MyPy и запустить проверку.
- SonarLint — указывает на различные ошибки в нейминге переменных/функций/классов. Использование: Ctrl+Shift+S или выбрать в нижнем меню SonarLint и запустить проверку.`
- Python Security — проверяет код на уязвимости, работает автоматически.
- Quick File Preview — посмотреть файл не открывая его, полезен если вы постоянно бегаете по файлам в поисках буквально 1 строчки и нет смысла полностью открывать файл (в данный момент этот функционал уже реализован в PyCharm:https://www.jetbrains.com/help/idea/2020.3/using-code-editor.html#preview-tab). Использование: Один раз кликнуть на файл.
- String Manipulation — работа с названиями переменных/функций и т. п. (можно привести к snake_case, camelCase и т. п.), Использование: выделить нужное слово, нажать ПКМ, нажать String Manipulation, нажать Switch Case и выбрать нужный пункт.
- Rainbow Brackets — красит скобочки в свой цвет, нужно чтобы чётко видеть иерархию скобок.
- Python Smart Execute — запустить блок кода в консоли, не запуская при этом саму программу (к примеру для теста на работоспособность). Использование: выделить код и Alt+Shift+A, или нажать ПКМ и выбрать Smart execute.
- MultiHighlight — выделить какое-либо название цветом (к примеру чтобы не забыть отрефакторить этот кусок). Использование: Выделить кусок и нажать Ctrl+’
- Dummy Text Generator — сгенерировать рандомное предложение в различных стилях. Бывает полезно для теста функционала (к примеру, что текст отображения не вылазит за рамки). Использование: Нажать ПКМ, выбрать Generate (либо Alt+Insert), выбрать Generate Dummy Text.
- Randomness — сгенерировать случайное число, строку и т. п. Использование: нажать Alt+R и выбрать нужное действие.
- CodeGlance — добавляет карту с кодом в правую часть окна.
- Extra Icons — изменяет стандартные иконки. Использование: Включить Settings/Appearance Behavior/Extra Icons
- Mario Progress Bar — изменяет стандартный прогресс бар на марио.
Теперь предлагаю перейти на интересные сочетания клавиш, которые позволят вам быстрее выполнять стандартные действия, да и просто ускорят вашу разработку (кнопки для обычной, НЕ МАКОВСКОЙ клавиатуры).

- Ctrl+Alt+S — Перейти в настройки (откроется та часть где вы остановились).
- Ctrl+Shift+Стрелочки (вверх, вниз) — Переместить строчку вверх или вниз.
- Ctrl+D/Y — Дублировать строчку/Удалить строчку.
- Alt+Enter — Привести код к принятым стандартам (для Python — PEP8).
- Ctrl+B — Переместиться к реализации данного класса/метода и т. п.
- Ctrl+R — Изменить название класса/функции и т. п. по всему проекту.
- Double tap on Shift — поиск в классе, функции, файле, PyCharm action или везде.
- Ctrl+J — Использовать шаблон кода.
- Alt+Enter — произвести настройку класса/функции и т. п. (к примеру указать типы принимаемых и возвращаемых значений).
- Ctrl+E — Навигация по файлам (отображает список файлов в хронологическом порядке).
- Ctrl+Alt+M — Объединить выделенный код в функцию/метод.
- Ctrl+N — Найти класс/метод и т. п. по названию (по всем местам).
- Ctrl+Shift+N — Найти файл по названию (по всем местам).
- Alt+F7 — Посмотреть где используется класс/метод/функция и т. п.
- Ctrl+F12 — Показывает структура файла (класса, функции и т. п).
Думаю про горячие клавиши всё понятно, тут главное не спутать их 🙂
Под конец предлагаю рассмотреть интересные настройки, которые улучшат ваш опыт работы с ide.
- Настроить интерпретатор. Тут вы сможете изменить версию Python, добавить библиотеки и ещё много чего интересного. File -> Settings -> Project: -> Project Interpreter
- Изменить шрифты, размеры и т. д. File -> Settings -> editor -> font
- Поменять цветовую схему UI. File -> Settings -> editor -> color scheme
- Deploy на сервер. Эта настройка открывает нам целый мир удобного деплоя, если будет интересно, могу написать отдельную статью просвещённую деплою. Tools -> Deployment -> Configuration
- Добавление плагинов. File -> Settings -> Plugins
- Это не совсем настройка, но всё же находится в меню, так что я решил добавить это сюда. Позволяет посмотреть небольшую статистику своей продуктивности. Help -> MyProductivity
На этом основные настройки заканчиваются, да их не так много как тех же плагинов или хоткеев, но для начала думаю достаточно.
Спасибо что прочитали эту статью, надеюсь вы смогли подчерпнуть с неё нечто новое.
Пишите свои крутые плагины, хоткеи, настройки, если сообществу понравится я обязательно добавлю их в статью.
Объектно-ориентированное программирование
Python имеет множество встроенных типов, например, int, str и так далее, которые мы можем использовать в программе. Но также Python позволяет определять собственные типы с помощью классов . Класс представляет некоторую сущность. Конкретным воплощением класса является объект.
Можно еще провести следующую аналогию. У нас у всех есть некоторое представление о человеке, у которого есть имя, возраст, какие-то другие характеристики Человек может выполнять некоторые действия — ходить, бегать, думать и т.д. То есть это представление, которое включает набор характеристик и действий, можно назвать классом. Конкретное воплощение этого шаблона может отличаться, например, одни люди имеют одно имя, другие — другое имя. И реально существующий человек будет представлять объект этого класса.
Класс определяется с помощью ключевого слова class :
class название_класса: атрибуты_класса методы_класса
Внутри класса определяются его атрибуты, которые хранят различные характеристики класса, и методы — функции класса.
Создадим простейший класс:
class Person: pass
В данном случае определен класс Person, который условно представляет человека. В данном случае в классе не определяется никаких методов или атрибутов. Однако поскольку в нем должно быть что-то определено, то в качестве заменителя функционала класса применяется оператор pass . Этот оператор применяется, когда синтаксически необходимо определить некоторый код, однако мы не хотим его, и вместо конкретного кода вставляем оператор pass.
После создания класса можно определить объекты этого класса. Например:
class Person: pass tom = Person() # определение объекта tom bob = Person() # определение объекта bob
После определения класса Person создаются два объекта класса Person — tom и bob. Для создания объекта применяется специальная функция — конструктор , которая называется по имени класса и которая возвращает объект класса. То есть в данном случае вызов Person() представляет вызов конструктора. Каждый класс по умолчанию имеет конструктор без параметров:
tom = Person() # Person() - вызов конструктора, который возвращает объект класса Person
Методы классов
Методы класса фактически представляют функции, которые определенны внутри класса и которые определяют его поведение. Например, определим класс Person с одним методом:
class Person: # определение класса Person def say_hello(self): print("Hello") tom = Person() tom.say_hello() # Hello
Здесь определен метод say_hello() , который условно выполняет приветствие — выводит строку на консоль. При определении методов любого класса следует учитывать, что все они должны принимать в качестве первого параметра ссылку на текущий объект, который согласно условностям называется self . Через эту ссылку внутри класса мы можем обратиться к функциональности текущего объекта. Но при самом вызове метода этот параметр не учитывается.
Используя имя объекта, мы можем обратиться к его методам. Для обращения к методам применяется нотация точки — после имени объекта ставится точка и после нее идет вызов метода:
объект.метод([параметры метода])
Например, обращение к методу say_hello() для вывода приветствия на консоль:
tom.say_hello() # Hello
В итоге данная программа выведет на консоль строку «Hello».
Если метод должен принимать другие параметры, то они определяются после параметра self , и при вызове подобного метода для них необходимо передать значения:
class Person: # определение класса Person def say(self, message): # метод print(message) tom = Person() tom.say("Hello METANIT.COM") # Hello METANIT.COM
Здесь определен метод say() . Он принимает два параметра: self и message. И для второго параметра — message при вызове метода необходимо передать значение.
self
Через ключевое слово self можно обращаться внутри класса к функциональности текущего объекта:
self.атрибут # обращение к атрибуту self.метод # обращение к методу
Например, определим два метода в классе Person:
class Person: def say(self, message): print(message) def say_hello(self): self.say("Hello work") # обращаемся к выше определенному методу say tom = Person() tom.say_hello() # Hello work
Здесь в одном методе — say_hello() вызывается другой метод — say() :
self.say("Hello work")
Поскольку метод say() принимает кроме self еще параметры (параметр message), то при вызове метода для этого параметра передается значение.
Причем при вызове метода объекта нам обязательно необходимо использовать слово self , если мы его не используем:
def say_hello(self): say("Hello work") # ! Ошибка
То мы столкнемся с ошибкой
Конструкторы
Для создания объекта класса используется конструктор. Так, выше когда мы создавали объекты класса Person, мы использовали конструктор по умолчанию, который не принимает параметров и который неявно имеют все классы:
tom = Person()
Однако мы можем явным образом определить в классах конструктор с помощью специального метода, который называется __init__() (по два прочерка с каждой стороны). К примеру, изменим класс Person, добавив в него конструктор:
class Person: # конструктор def __init__(self): print("Создание объекта Person") def say_hello(self): print("Hello") tom = Person() # Создание объекта Person tom.say_hello() # Hello
Итак, здесь в коде класса Person определен конструктор и метод say_hello() . В качестве первого параметра конструктор, как и методы, также принимает ссылку на текущий объект — self. Обычно конструкторы применяются для определения действий, которые должны производиться при создании объекта.
Теперь при создании объекта:
tom = Person()
будет производится вызов конструктора __init__() из класса Person, который выведет на консоль строку «Создание объекта Person».
Атрибуты объекта
Атрибуты хранят состояние объекта. Для определения и установки атрибутов внутри класса можно применять слово self . Например, определим следующий класс Person:
class Person: def __init__(self, name): self.name = name # имя человека self.age = 1 # возраст человека tom = Person("Tom") # обращение к атрибутам # получение значений print(tom.name) # Tom print(tom.age) # 1 # изменение значения tom.age = 37 print(tom.age) # 37
Теперь конструктор класса Person принимает еще один параметр — name. Через этот параметр в конструктор будет передаваться имя создаваемого человека.
Внутри конструктора устанавливаются два атрибута — name и age (условно имя и возраст человека):
def __init__(self, name): self.name = name self.age = 1
Атрибуту self.name присваивается значение переменной name. Атрибут age получает значение 1.
Если мы определили в классе конструктор __init__, мы уже не сможем вызвать конструктор по умолчанию. Теперь нам надо вызывать наш явным образом опреледеленный конструктор __init__, в который необходимо передать значение для параметра name:
tom = Person("Tom")
Далее по имени объекта мы можем обращаться к атрибутам объекта — получать и изменять их значения:
print(tom.name) # получение значения атрибута name tom.age = 37 # изменение значения атрибута age
В принципе нам необязательно определять атрибуты внутри класса — Python позволяет сделать это динамически вне кода:
class Person: def __init__(self, name): self.name = name # имя человека self.age = 1 # возраст человека tom = Person("Tom") tom.company = "Microsoft" print(tom.company) # Microsoft
Здесь динамически устанавливается атрибут company, который хранит место работы человека. И после установки мы также можем получить его значение. В то же время подобное определение чревато ошибками. Например, если мы попытаемся обратиться к атрибуту до его определения, то программа сгенерирует ошибку:
tom = Person("Tom") print(tom.company) # ! Ошибка - AttributeError: Person object has no attribute company
Для обращения к атрибутам объекта внутри класса в его методах также применяется слово self:
class Person: def __init__(self, name): self.name = name # имя человека self.age = 1 # возраст человека def display_info(self): print(f"Name: Age: ") tom = Person("Tom") tom.display_info() # Name: Tom Age: 1
Здесь определяется метод display_info(), который выводит информацию на консоль. И для обращения в методе к атрибутам объекта применяется слово self: self.name и self.age
Создание объектов
Выше создавался один объект. Но подобным образом можно создавать и другие объекты класса:
class Person: def __init__(self, name): self.name = name # имя человека self.age = 1 # возраст человека def display_info(self): print(f"Name: Age: ") tom = Person("Tom") tom.age = 37 tom.display_info() # Name: Tom Age: 37 bob = Person("Bob") bob.age = 41 bob.display_info() # Name: Bob Age: 41
Здесь создаются два объекта класса Person: tom и bob. Они соответствуют определению класса Person, имеют одинаковый набор атрибутов и методов, однако их состояние будет отличаться.
При выполнении программы Python динамически будет определять self — он представляет объект, у которого вызывается метод. Например, в строке:
tom.display_info() # Name: Tom Age: 37
Это будет объект tom
bob.display_info()
Это будет объект bob
В итоге мы получим следующий консольный вывод:
Name: Tom Age: 37 Name: Bob Age: 41
Как создать класс в IntelliJ IDEA для элементарной программы
От автора: первый шаг к разработке полномасштабных приложений — это создать класс в IntelliJ IDEA. Ну, а лучше учиться, создавая простейшие программы с помощью кода. Сегодня вместе создадим простую программу «Hello World!». Заодно покажем базовый функционал среды разработки, с которой имеем дело. Работая с нашей пошаговой инструкцией, вы сумеете привыкнуть к интерфейсу и будете ближе к уверенному использованию IDE.

Стартуем с набора!
Скорее всего, этот шаг вы уже выполнили, и нет нужды опять возвращаться к нему. Но на всякий случай напомним: для работы с IntelliJ IDEA необходимо установка набора разработчика — Java Development Kit. Его можно стянуть с официального сайта Oracle. Кстати, там есть и мануал по установке. Но если вы еще новичок, то в интернете есть более детальные инструкции, вплоть до видеоматериалов.
Первый проект
Итак, допустим, что вы успешно установили JDK. Если же это не получилось с первого раза, не отчаивайтесь: даже лучшие из людей иногда делают ошибки в установке набора разработчика. Просто удалите все, что распаковали на компьютер, откройте инструкцию и пройдите ее еще раз. Все заработает!

А теперь возвращаемся обратно к IntelliJ IDEA. Если вы читатель статьи, значит, скорее всего, проектов еще не создавали. Пришло время первого — кликните по значку среды и нажмите кнопку Create New Project. Если на данном этапе что-то пошло не так, то в 9 из 10 случаев проблема с JDK. Он либо не установлен, либо его не видит система. Устранить данную проблему можно, оперируя в переменных средах. Решение есть в сети.
Сначала вы не получите доступ непосредственно к проекту. Для начала, зададим исходные данные в мастере создания. Так как пишем на Java без «примесей», то нашим выбором в правом окне станет Java Module. Ну, а далее указываем название. Назовите его «first» и оставьте на память.
И вот, снова сталкиваемся с JDK. Он установлен, система его видит, но нужно провести настройку. Для этого выбираем в подменю JDK из Project SDK и жмем на кнопку New. Таким образом, переходим в новое меню, где нужно выбрать папку с установленным Java Development Kit — вы же помните, куда его установили?
Получили подтверждение об установленном JDK и нажимаем Next. Внимательно подходите к настройке. От того, к какой версии набора вы подключите среду разработки, зависит структура не только этого, но и всех последующих проектов. Java-модули будут подключаться к этому набору.
Теперь нам нужно указать, какие технологии подключим к проекту. Но, так как наше приложение будет простым и незамысловатым, нам нужен только один инструмент — язык Java. Ну и остальной софт, который позволяет к нему обращаться. Немного ждем создания структуры проекта и идем создавать программу дальше.
Теперь перейдем во вкладку Project и увидим, какую структуру имеет наш проект:
First. Так было названо наше приложение и такое название носит Java-модуль. Так же называется и узел, в котором хранятся все необходимые файлы:
.idea. Здесь хранятся все файлы конфигурации проекта, обеспечивающие то, что на другой IntelliJ вы откроете этот проект с такими же настройками;
src — содержит исходный код, который вы и напишете;
External Libraries. Здесь обычно хранятся все необходимые внешние инструменты, на которых построено приложение. Но, так как наша программа весьма проста, то к ней подключены только файлы .jar, которые были взяты из Java Development Kit.
Все в класс
Вернее, в пакет для класса. Необходимо для начала назвать его: com.sample.first звучит неплохо. Теперь работаем по инструкции.
Открываем окно инструментов Project и выбираем директорию src, в которой у нас хранится исходный код, а потом жмем Alt+Insert.
В меню под названием New выбираем Package.
Там, где открылось окно, теперь нужно ввести название пакета. Теперь в каталоге src у нас есть новый пакет, который видно в окне Project.
И, наконец, создадим новый класс. Кликаем по названию пакета, выбираем Java Class. Появляется окно для названия, и вводим его — на ваше усмотрение. Класс появился в структуре. Таким образом, поставленная на сегодня задача выполнена. Бывают и случаи, когда класс не создается, либо IntelliJ IDEA не видит классы. Но это тема для отдельной статьи.
