Конструктор класса задается методом с именем python

Обновлено: 01.05.2024

В языке программирования Python классы создаются с помощью инструкции class, за которой следует произвольное имя класса, после которого ставится двоеточие, далее с новой строки и с отступом реализуется тело класса:

Если класс является дочерним, то родительские классы перечисляются в круглых скобках после имени класса.

Объект создается путем вызова класса по его имени. При этом после имени класса обязательно ставятся скобки:

То есть класс вызывается подобно функции. Однако в случае вызова класса происходит не выполнение его тела, как это происходило бы при вызове функции, а создается объект. Поскольку в программном коде важно не потерять ссылку на только что созданный объект, то обычно его связывают с переменной. Поэтому создание объекта чаще всего выглядит так:

В последствии к объекту обращаются через связанную с ним переменную.

Пример "пустого" класса и двух созданных на его основе объектов:

Класс как пространство имен

С точки зрения пространства имен класс можно представить подобным модулю. Также как в модуле в классе могут быть свои переменные со значениями и функции. Также как в модуле у класса есть собственное пространство имен, доступ к которому возможен через имя класса:

Однако в случае классов используется особая терминология. Пусть имена, определенные в классе, называются атрибутами этого класса. В примере имена n и adder – это атрибуты класса B . Атрибуты-переменные часто называют полями или свойствами (в других языках понятия "поле" и "свойство" не совсем одно и то же). Полем является n . Атрибуты-функции называются методами. Методом в классе B является adder . Количество свойств и методов в классе может быть любым.

Класс как шаблон для создания объектов

На самом деле классы – не модули. Они своего рода шаблоны, от которых создаются объекты-экземпляры. Такие объекты наследуют от класса его атрибуты. Вернемся к нашему классу B и создадим на его основе два объекта:

У объектов, связанных с переменными a и b , нет собственного поля n . Однако они наследуют его от своего класса:

То есть поля a.n и B.n – это одно и то же поле, к которому можно обращаться и через имя a , и через имя b , и через имя класса. Поле одно, ссылок на него три.

Однако что произойдет в момент присваивания этому полю значения через какой-нибудь объект-экземпляр?

В этот момент у экземпляра появляется собственный атрибут n , который перекроет (переопределит) родительский, то есть тот, который достался от класса.

При этом присвоение через B.n отразится только на b и B , но не на a :

Иная ситуация нас ожидает с атрибутом adder . При создании объекта от класса функция adder не наследуется как есть, а как бы превращается для объекта в одноименный метод:

Через имя класса мы вызываем функцию adder :

Через имя объекта вызываем метод adder :

Дело в том, что в отличии от функции в метод первым аргументом всегда передается объект, к которому применяется этот метод. То есть выражение b.adder(33) как бы преобразовывается в adder(b, 33) . Сам же b.adder как объект типа method хранит сведения, с каким классом он связан и какому объекту-экземпляру принадлежит:

В нашем случае, чтобы вызывать adder через объекты-экземпляры, класс можно переписать так:

В коде выше при вызове метода adder переменной-параметру obj присваивается объект, связанный с переменной, к которой применяется данный метод. В данном случае это объект, связанный с b . Если adder будет вызван на другой объект, то уже он присвоится obj :

В Python принято переменную-параметр метода, которая связывается с экземпляром своего класса, называть именем self. Таким образом, более корректный код будет таким:

Можем ли мы все также вызывать adder как функцию, через имя класса? Вполне. Только теперь в функцию надо передавать два аргумента:

Здесь первым аргументом в функцию передается объект, у которого есть поле n лишь только потому, что далее к этому полю обращаются через выражение self.n .

Однако если атрибут определен так, что предполагается его работа в качестве метода, а не функции, то через класс его уже не вызывают (нет смысла, логика программы этого не подразумевает).

С другой стороны, в ООП есть понятие "статический метод". По сути это функция, которая может вызываться и через класс, и через объект, и которой первым аргументом не подставляется объект, на который она вызывается. В Python статический метод можно создать посредством использования специального декоратора.

Атрибут __dict__

В Python у объектов есть встроенные специальные атрибуты. Мы их не определяем, но они есть. Одним из таких атрибутов объекта является свойство __dict__. Его значением является словарь, в котором ключи – это имена свойств экземпляра, а значения – текущие значения свойств.

В примере у экземпляра класса B сначала нет собственных атрибутов. Свойство n и метод adder – это атрибуты объекта-класса, а не объекта-экземпляра, созданного от этого класса. Лишь когда мы выполняем присваивание новому полю n экземпляра, у него появляется собственное свойство, что мы наблюдаем через словарь __dict__.

В следующем уроке мы увидим, что свойства экземпляра обычно не назначаются за пределами класса. Это происходит в методах классах путем присваивание через self. Например, self.n = 10 .

Атрибут __dict__ используется для просмотра всех текущих свойств объекта. С его помощью можно удалять, добавлять свойства, а также изменять их значения.

Практическая работа

Курс с примерами решений практических работ:
android-приложение, pdf-версия

Как и другие языки программирования общего назначения, Python с самого начала является объектно-ориентированным языком. Это позволяет нам разрабатывать приложения с использованием объектно-ориентированного подхода. В Python мы можем легко создавать и использовать классы и объекты.

Объектно-ориентированная парадигма заключается в разработке программы с использованием классов и объектов. Объект связан с сущностями реального слова, такими как книга, дом, карандаш и т. д. Концепция Oops в Python фокусируется на написании повторно используемого кода. Это широко распространенный метод решения проблемы путем создания объектов.

Ниже приведены основные принципы системы объектно-ориентированного программирования:

    ;
  • Метод; ;
  • Полиморфизм; ;
  • Инкапсуляция.

Класс

Класс можно определить как набор объектов. Это логическая сущность, имеющая определенные атрибуты и методы. Например: если у вас есть класс сотрудника, он должен содержать атрибут и метод, то есть идентификатор электронной почты, имя, возраст, зарплату и т. д.

Объект

Объект – это сущность, у которой есть состояние и поведение. Это может быть любой объект реального мира, например, мышь, клавиатура, стул, стол, ручка и т. д.

В Python все является объектом, и почти все имеет атрибуты и методы. Все функции имеют встроенный атрибут __doc__, который возвращает строку документации, определенную в исходном коде функции.

Когда мы определяем класс, он должен создать объект для выделения памяти. Рассмотрим следующий пример.

В приведенном выше примере мы создали класс с именем car, и у него есть два атрибута modelname и year. Мы создали объект c1 для доступа к атрибуту класса. Объект c1 выделит память для этих значений. Мы узнаем больше о классе и объекте в следующем уроке.

Метод

Метод – это функция, связанная с объектом. В Python метод не уникален для экземпляров класса. У любого типа объекта могут быть методы.

Наследование

Наследование – это наиболее важный аспект объектно-ориентированного программирования, который имитирует реальную концепцию наследования. Он указывает, что дочерний объект приобретает все свойства и поведение родительского объекта.

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

Это обеспечивает возможность повторного использования кода.

Полиморфизм

Полиморфизм состоит из двух слов «poly» (много) и «morphs» (форма). Под полиморфизмом мы понимаем, что одну задачу можно выполнять по-разному. Например – у вас класс животных, и все животные говорят. Но “говорят” по-иному. Здесь «говорящее» поведение в некотором смысле полиморфно и зависит от животного. Итак, абстрактное понятие «животное» на самом деле не «говорит», но конкретные животные (например, собаки и кошки) имеют конкретную реализацию действия «говорить».

Инкапсуляция

Инкапсуляция также является важным аспектом объектно-ориентированного программирования. Она используется для ограничения доступа к методам и переменным. При инкапсуляции код и данные объединяются в один блок от случайного изменения.

Абстракция данных

И абстракция данных, и инкапсуляция часто используются как синонимы. Являются почти однозначными, поскольку абстракция данных достигается за счет инкапсуляции.

Абстракция используется, чтобы скрыть внутренние детали и показать только функциональные возможности. Абстрагирование чего-либо означает присвоение имен вещам, чтобы имя отражало суть того, что делает функция или вся программа.

Объектно-ориентированные и процедурно-ориентированные языки программирования

Разница между объектно-ориентированным и процедурно-ориентированным программированием приведена ниже:

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

В C ++ или Java конструктор имеет то же имя, что и его класс, в Python конструктор обрабатывается по-разному. Он используется для создания объекта.

Конструкторы бывают двух типов:

  1. Параметризованный конструктор
  2. Непараметрический конструктор

Определение конструктора выполняется, когда мы создаем объект этого класса. Конструкторы также проверяют, что у объекта достаточно ресурсов для выполнения любой задачи запуска.

Создание конструктора на Python

В Python метод __init __() имитирует конструктор класса. Этот метод вызывается при создании экземпляра класса. Он принимает ключевое слово self в качестве первого аргумента, который позволяет получить доступ к атрибутам или методу класса.

Мы можем передать любое количество аргументов во время создания объекта класса, в зависимости от определения __init __(). В основном он используется для инициализации атрибутов класса. У каждого класса должен быть конструктор, даже если он просто полагается на конструктор по умолчанию.

Рассмотрим следующий пример для инициализации атрибутов класса Employee при работе с конструкторами в Python.

Подсчет количества объектов класса

Конструктор вызывается автоматически, когда мы создаем объект класса. Рассмотрим следующий пример.

Непараметрический

Непараметрический конструктор используется, когда мы не хотим манипулировать значением, или конструктором, который имеет только self в качестве аргумента. Разберем на примере.

Параметризованный конструктор Python

У параметризованного конструктора есть несколько параметров вместе с самим собой.

Конструктор Python по умолчанию

Когда мы не включаем конструктор в класс или забываем его объявить, он становится конструктором по умолчанию. Он не выполняет никаких задач, а инициализирует объекты. Рассмотрим пример.

Более одного конструктора в одном классе

Давайте посмотрим на другой сценарий, что произойдет, если мы объявим два одинаковых конструктора в классе.

В приведенном выше коде объект st вызвал второй конструктор, тогда как оба имеют одинаковую конфигурацию. Первый метод недоступен для объекта st. Внутренне объект класса всегда будет вызывать последний конструктор, если у класса есть несколько конструкторов.

Примечание. Перегрузка конструктора в Python запрещена.

Встроенные функции классов Python

Встроенные функции, определенные в классе, описаны в следующей таблице.

SN Функция Описание
1 getattr(obj,name,default) Используется для доступа к атрибуту объекта.
2 setattr(obj, name,value) Она используется для установки определенного значения для определенного атрибута объекта.
3 delattr (obj, name) Необходима для удаления определенного атрибута.
4 hasattr (obj, name) Возвращает истину, если объект содержит определенный атрибут.

Встроенные атрибуты класса

Наряду с другими атрибутами класс Python также содержит некоторые встроенные атрибуты класса, которые предоставляют информацию о классе.

Python – это «объектно-ориентированный язык программирования». Это означает, что большая часть кода реализована с помощью специальной конструкции, известной как классы. Программисты используют классы, чтобы связывать вещи вместе. Мы можем сделать это с помощью ключевого слова «class», которое представляет собой группу объектно-ориентированных конструкций.

В данном руководстве мы рассмотрим следующие темы:

  • Что такое класс?
  • Как создать?
  • Что такое метод?
  • Как создать экземпляр объекта?
  • Как создать атрибуты в Python?

Понимание класса

Класс считается шаблоном кода, используемым для создания объектов в Python. Объекты состоят из переменных-членов и имеют связанное с ними поведение. В таком языке программирования, как Python, мы можем создать класс, используя ключевое слово «class».

Мы можем создать объект с помощью конструктора класса. Затем этот объект будет распознан как экземпляр класса. В Python мы можем создавать экземпляры, используя следующий синтаксис:

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

Мы можем создать класс, используя ключевое слово class, как мы читали ранее. Давайте теперь рассмотрим пример, демонстрирующий создание простого пустого класса без функциональных возможностей.

В приведенном выше фрагменте кода мы определили пустой класс как «College». Затем мы создали экземпляр класса, используя ученика в качестве объекта, и напечатали этот объект для пользователей.

Атрибуты и методы в классе

Класс сам по себе не используется, пока с ним не связаны некоторые функции. Мы можем определить эти функции, установив атрибуты, которые действуют как контейнеры для данных и функций, связанных с этими атрибутами. Мы называем эти функции методами.

Атрибуты

Мы можем определить следующий класс с именем College. У этого класса будет атрибут student_name.

В приведенном выше фрагменте кода мы определили класс как «College». Затем мы определили атрибут как “student_name” внутри класса.

Теперь давайте попробуем присвоить класс переменной, то есть создадим экземпляр объекта. После этого мы сможем получить доступ к атрибутам, доступным в классе, с помощью dot . оператора. Давайте рассмотрим это на примере:

В приведенном выше фрагменте кода мы выполнили ту же процедуру, что и в предыдущем примере. Однако теперь мы создали экземпляр класса и напечатали значение атрибута с помощью объекта.

Методы

После того, как мы определили атрибуты, принадлежащие классу, теперь мы можем определить несколько функций для доступа к атрибутам класса. Эти функции известны как методы. Каждый раз, когда мы определяем метод, необходимо всегда предоставлять первый аргумент методу с ключевым словом «self».

Давайте рассмотрим следующий пример, демонстрирующий это.

В приведенном выше фрагменте кода мы определили класс и определили его атрибут. Затем мы определили метод как change_std_name для изменения предыдущего значения атрибута на другое. Затем мы создали экземпляр класса и распечатали необходимые выходные данные для пользователей. В результате мы можем наблюдать другое значение атрибута.

В объектно-ориентированном программировании конструктором класса называют метод, который автоматически вызывается при создании объектов. Его также можно назвать конструктором объектов класса. Имя такого метода обычно регламентируется синтаксисом конкретного языка программирования. Так в Java имя конструктора класса совпадает с именем самого класса. В Python же роль конструктора играет метод __init__().

В Python наличие пар знаков подчеркивания спереди и сзади в имени метода говорит о том, что он принадлежит к группе методов перегрузки операторов. Если подобные методы определены в классе, то объекты могут участвовать в таких операциях как сложение, вычитание, вызываться как функции и др.

При этом методы перегрузки операторов не надо вызывать по имени. Вызовом для них является сам факт участия объекта в определенной операции. В случае конструктора класса – это операция создания объекта. Так как объект создается в момент вызова класса по имени, то в этот момент вызывается метод __init__().

Необходимость конструкторов связана с тем, что нередко объекты должны иметь собственные свойства сразу. Пусть имеется класс Person, объекты которого обязательно должны иметь имя и фамилию. Если класс будет описан подобным образом

то создание объекта возможно без полей. Для установки имени и фамилии метод set_name() нужно вызывать отдельно:

В свою очередь, конструктор класса не позволит создать объект без обязательных полей:

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

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

Однако бывает, что надо допустить создание объекта, даже если никакие данные в конструктор не передаются. В таком случае параметрам конструктора класса задаются значения по умолчанию:

Если класс вызывается без значений в скобках, то для параметров будут использованы их значения по умолчанию. Однако поля width и height будут у всех объектов.

Кроме того, конструктору вовсе не обязательно принимать какие-либо параметры, не считая self. Значения полям могут назначаться как угодно. Также не обязательно, чтобы в конструкторе происходила установка атрибутов объекта. Там может быть, например, код, который порождает создание объектов других классов.

В других языка программирования, например в Java, классы могут содержать несколько конструкторов, которые между собой отличаются количеством параметром, а также, возможно, их типом. При создании объекта срабатывает тот конструктор, количество и типы параметров которого совпали с количеством и типами переданных в конструктор аргументов.

В Python создать несколько методов __init__() в классе можно, однако "рабочим" останется только последний. Он переопределит ранее определенные. Поэтому в Python в классах используется только один конструктор, а изменчивость количества передаваемых аргументов настраивается через назначение значений по-умолчанию.

Практическая работа. Конструктор и деструктор

Помимо конструктора объектов в языках программирования есть обратный ему метод – деструктор. Он вызывается, когда объект не создается, а уничтожается.

В языке программирования Python объект уничтожается, когда исчезают все связанные с ним переменные или им присваивается другое значение, в результате чего связь со старым объектом теряется. Удалить переменную можно с помощью команды языка del.

В классах Python функцию деструктора выполняет метод __del__().

Напишите программу по следующему описанию:

Есть класс Person, конструктор которого принимает три параметра (не учитывая self) – имя, фамилию и квалификацию специалиста. Квалификация имеет значение заданное по умолчанию, равное единице.

У класса Person есть метод, который возвращает строку, включающую в себя всю информацию о сотруднике.

Класс Person содержит деструктор, который выводит на экран фразу "До свидания, мистер …" (вместо троеточия должны выводиться имя и фамилия объекта).

В основной ветке программы создайте три объекта класса Person. Посмотрите информацию о сотрудниках и увольте самое слабое звено.

В конце программы добавьте функцию input(), чтобы скрипт не завершился сам, пока не будет нажат Enter. Иначе вы сразу увидите как удаляются все объекты при завершении работы программы.

В Python деструктор используется редко, так как интерпретатор и без него хорошо убирает "мусор".

Курс с примерами решений практических работ:
android-приложение, pdf-версия

Читайте также: