что такое объект класса в питоне
BestProg
Содержание
Поиск на других ресурсах:
1. Особенности использования классов в языке Python. Объекты классов и объекты экземпляров
В языке программирования Python классы характеризуются следующими особенностями:
Как известно, в языке Python любой элемент (число, строка, список и т.д) представлен объектом. Это касается и объектно-ориентированной модели Python, в которой различают два типа объектов:
2. Создание объекта класса. Общая форма
На основании имени ClassName может быть создан реальный объект экземпляра.
3. Создание объекта экземпляра. Общая форма
Общая форма создания объекта экземпляра следующая:
4. Особенности объектов классов
В языке Python для объектов классов можно выделить следующие особенности:
5. Особенности объектов экземпляров
Объект экземпляра есть результатом вызова объекта класса. Для объектов экземпляров можно выделить следующие характерные особенности:
6. Что такое атрибут класса? Пример класса Circle
Атрибутом класса считается элемент, который реализован в классе. Таким элементом может быть метод, оператор, поле данных и т.д.
В вышеприведенном классе Circle реализованы следующие атрибуты:
7. Пример объявления и использования простого класса, сохраняющего некоторое значение
Результат выполнения программы
На рисунке 1 изображены объекты, которые создаются в вышеприведенном примере.
Рисунок 1. Структура программы: объекты экземпляра и объект класса
8. Пример реализации класса, который сохраняет набор данных. Класс SquareEquation — решение квадратного уравнения
Объектно-ориентированное программирование
Классы и объекты
Python поддерживает объектно-ориентированную парадигму программирования, а это значит, что мы можем определить компоненты программы в виде классов.
Класс определяется с помощью ключевого слова class :
Для создания объекта класса используется следующий синтаксис:
Например, определим простейший класс Person, который будет представлять человека:
Класс Person определяет атрибут name, который хранит имя человека, и метод display_info, с помощью которого выводится информация о человеке.
Конструкторы
Для создания объекта класса используется конструктор. Так, выше когда мы создавали объекты класса Person, мы использовали конструктор по умолчанию, который неявно имеют все классы:
В итоге мы получим следующий консольный вывод:
Деструктор
После окончания работы с объектом мы можем использовать оператор del для удаления его из памяти:
Стоит отметить, что в принципе это необязательно делать, так как после окончания работы скрипта все объекты автоматически удаляются из памяти.
Определение классов в модулях и подключение
Как правило, классы размещаются в отдельных модулях и затем уже импортируются в основой скрипт программы. Пусть у нас будет в проекте два файла: файл main.py (основной скрипт программы) и classes.py (скрипт с определением классов).
В файле classes.py определим два класса:
В дополнение к классу Person здесь также определен класс Auto, который представляет машину и который имеет метод move и атрибут name. Подключим эти классы и используем их в скрипте main.py :
Подключение классов происходит точно также, как и функций из модуля. Мы можем подключить весь модуль выражением:
Либо подключить отдельные классы, как в примере выше.
В итоге мы получим следующий консольный вывод:
ООП на Python: концепции, принципы и примеры реализации
Программирование на Python допускает различные методологии, но в его основе лежит объектный подход, поэтому работать в стиле ООП на Python очень просто.
Если вам интересно, что думает об этой концепции сам ее создатель Алан Кэй, загляните сюда.
Язык Python – типичный представитель ООП-семейства, обладающий элегантной и мощной объектной моделью. В этом языке от объектов никуда не спрятаться (ведь даже числа являются ими), поэтому давайте разбираться, как это все реализовано.
Основы ООП на Python для начинающих
Классы
Создавать классы в Python очень просто:
Классы-родители перечисляются в скобках через запятую:
С реализацией наследования разберемся чуть позже.
Свойства классов устанавливаются с помощью простого присваивания:
Методы объявляются как простые функции:
Обратите внимание на первый аргумент – self – общепринятое имя для ссылки на объект, в контексте которого вызывается метод. Этот параметр обязателен и отличает метод класса от обычной функции.
Экземпляры классов
Инстанцировать класс в Python тоже очень просто:
Можно создавать разные инстансы одного класса с заранее заданными параметрами с помощью инициализатора (специальный метод __init__ ). Для примера возьмем класс Point (точка пространства), объекты которого должны иметь определенные координаты:
Подробнее о других специальных методах жизненного цикла объектов поговорим чуть ниже.
Динамическое изменение
Можно обойтись даже без определения атрибутов и методов:
Кажется, этот класс совершенно бесполезен? Отнюдь. Классы в Python могут динамически изменяться после определения:
Статические и классовые методы
Еще есть так называемые методы классов. Они аналогичны методам экземпляров, но выполняются не в контексте объекта, а в контексте самого класса (классы – это тоже объекты). Такие методы создаются с помощью декоратора @classmethod и требуют обязательную ссылку на класс ( cls ).
Статические и классовые методы доступны без инстанцирования.
Специальные методы
Жизненный цикл объекта
Это обсуждение на stackoverflow поможет лучше разобраться с инстанцированием классов.
Метод __new__ может быть очень полезен для решения ряда задач, например, создания иммутабельных объектов или реализации паттерна Синглтон:
На практике деструктор используется редко, в основном для тех ресурсов, которые требуют явного освобождения памяти при удалении объекта. Не следует совершать в нем сложные вычисления.
Объект как функция
Объект класса может имитировать стандартную функцию, то есть при желании его можно «вызвать» с параметрами. За эту возможность отвечает специальный метод __call__ :
Имитация контейнеров
Но для объектов вашего пользовательского класса это не пройдет:
Решить эту проблему поможет специальный метод __len__ :
Можно работать с объектом как с коллекцией значений, определив для него интерфейс классического списка с помощью специальных методов:
Имитация числовых типов
Ваши объекты могут участвовать в математических операциях, если у них определены специальные методы. Например, __mul__ позволяет умножать объект на число по определенной программистом логике:
Другие специальные методы
В Python существует огромное количество специальных методов, расширяющих возможности пользовательских классов. Например, можно определить вид объекта на печати, его «официальное» строковое представление или поведение при сравнениях. Узнать о них подробнее вы можете в официальной документации языка.
Принципы ООП на Python
Рассмотрим «большую тройку» объектно-ориентированной концепции: инкапсуляцию, полиморфизм и наследование.
Инкапсуляция
Все объекты в Python инкапсулируют внутри себя данные и методы работы с ними, предоставляя публичные интерфейсы для взаимодействия.
Атрибут может быть объявлен приватным (внутренним) с помощью нижнего подчеркивания перед именем, но настоящего скрытия на самом деле не происходит – все на уровне соглашений.
Если поставить перед именем атрибута два подчеркивания, к нему нельзя будет обратиться напрямую. Но все равно остается обходной путь:
Специальные свойства и методы класса, некоторые из которых вам уже знакомы, имеют двойные подчеркивания до и после имени.
Кроме прямого доступа к атрибутам ( obj.attrName ), могут быть использованы специальные методы доступа (геттеры, сеттеры и деструкторы):
Такой подход очень удобен, если получение или установка значения атрибута требует сложной логики.
__getattribute__ перехватывает все обращения (в том числе и к существующим атрибутам):
Таким образом, можно организовать динамический доступ к методам и свойствам объекта, как действуют, например, RPC-системы.
Наследование
Язык программирования Python реализует как стандартное одиночное наследование:
так и множественное:
Используя множественное наследования можно создавать классы-миксины (примеси), представляющие собой определенную особенность поведения. Такой микси можно «примешать» к любому классу.
Ассоциация
Кроме наследования, существует и другой способ организации межклассового взаимодействия – ассоциация (агрегация или композиция), при которой один класс является полем другого.
Ассоциированные объекты могут циклически ссылаться друг на друга, что ломает стандартный механизм сборки мусора. Избежать подобных проблем при ассоциации помогают слабые ссылки (модуль weakref ).
Полиморфизм
Концепция полиморфизма – важная часть ООП на Python. Все методы в языке изначально виртуальные. Это значит, что дочерние классы могут их переопределять и решать одну и ту же задачу разными путями, а конкретная реализация будет выбрана только во время исполнения программы. Такие классы называют полиморфными.
Впрочем, можно получить и доступ к методам класса-предка либо по прямому обращению, либо с помощью функции super :
Это возможно благодаря утиной типизации.
Множественная диспетчеризация
Виртуальные методы обеспечивают одиночную диспетчеризацию, при которой выбор конкретного метода зависит от объекта, в контексте которого произошел вызов. Мультиметоды позволяют выбирать нужную функциональность в зависимости от количества, типов или значений аргументов.
Программирование на Python не поддерживает мультиметоды из коробки, поэтому для их реализации необходимо подключать сторонние Python библиотеки, например, multimethods.py.
Подробнее о множественной диспетчеризации читайте в этой статье из серии «Очаровательный Python».
Порядок разрешения доступа к атрибутам
Каким же образом интерпретатор разрешает сложные запросы к свойствам и методам? Рассмотрим последовательность поиска на примере запроса obj.field :
Все эти проверки совершаются только для пользовательских атрибутов.
Метаклассы
Метаклассы – это классы, инстансы которых тоже являются классами.
Узнайте больше о метаклассах в Python из нашего материала.
ООП на Python
Подведем краткий итог всему вышесказанному и выделим основные особенности реализации ООП на Python:
Хотите лучше разобраться в объектно-ориентированном программировании? Смотрите понятный видеокурс по основам ООП.
Классы и объекты в Python – подробно с примерами
Мы уже обсуждали в предыдущем уроке, что класс – это виртуальная сущность, и ее можно рассматривать как план объекта. Класс появился при его создании. Разберемся на примере.
Предположим, класс – это прототип здания. Здание содержит все детали пола, комнат, дверей, окон и т. д. Мы можем построить столько зданий, сколько захотим, на основе этих деталей. Следовательно, здание можно рассматривать как класс, и мы можем создать столько объектов этого класса. С другой стороны, объект является экземпляром класса. Процесс создания объекта можно назвать инстанциацией.
В этом разделе мы обсудим примеры создания классов и их объектов в Python. Мы также обсудим, как получить доступ к атрибуту класса с помощью объекта.
Создание классов в Python
В Python класс можно создать, используя ключевое слово class, за которым следует имя класса. Синтаксис для создания класса приведен ниже.
Рассмотрим следующий пример для создания класса Employee, который содержит два поля: id и name. Класс также содержит функцию display(), которая используется для отображения информации о Employee.
Здесь self используется как ссылочная переменная, которая ссылается на текущий объект класса. Это всегда первый аргумент в определении функции. Однако использование self не является обязательным при вызове функции.
Самостоятельный параметр
Параметр self относится к текущему экземпляру класса и обращается к переменным класса. Мы можем использовать что угодно вместо self, но это должен быть первый параметр любой функции, принадлежащей классу.
Создание экземпляра класса
Если мы хотим использовать атрибуты класса в другом классе или методе, необходимо создать экземпляр класса. Класс может быть создан путем вызова класса с использованием имени класса.
Синтаксис для создания экземпляра класса приведен ниже.
В следующем примере создается экземпляр класса Employee, определенного в приведенном выше примере.
В приведенном выше коде мы создали класс Employee, который имеет два атрибута с именами id и name и присвоили им значение. Мы можем наблюдать, что передали self как параметр в функции отображения. Он используется для обозначения того же атрибута класса.
Мы создали новый объект-экземпляр с именем emp. Используя его, мы можем получить доступ к атрибутам класса.
Удаление объекта
Мы можем удалить свойства объекта или сам объект с помощью ключевого слова del. Рассмотрим следующий пример.
Возникнет ошибка атрибута, потому что мы удалили объект emp.
Примеры работы с классами в Python
Python — объектно-ориентированный язык с начала его существования. Поэтому, создание и использование классов и объектов в Python просто и легко. Эта статья поможет разобраться на примерах в области поддержки объектно-ориентированного программирования Python. Если у вас нет опыта работы с объектно-ориентированным программированием (OOП), ознакомьтесь с вводным курсом или учебным пособием, чтобы понять основные понятия.
Создание классов
Пример создания класса на Python:
Создание экземпляров класса
Доступ к атрибутам
Теперь, систематизируем все.
При выполнении этого кода, мы получаем следующий результат:
Вы можете добавлять, удалять или изменять атрибуты классов и объектов в любой момент.
Вместо использования привычных операторов для доступа к атрибутам вы можете использовать эти функции:
Встроенные атрибуты класса
Для вышеуказанного класса давайте попробуем получить доступ ко всем этим атрибутам:
Когда этот код выполняется, он возвращает такой результат:
Удаление объектов (сбор мусора)
Python автоматически удаляет ненужные объекты (встроенные типы или экземпляры классов), чтобы освободить пространство памяти. С помощью процесса ‘Garbage Collection’ Python периодически восстанавливает блоки памяти, которые больше не используются.
Сборщик мусора Python запускается во время выполнения программы и тогда, когда количество ссылок на объект достигает нуля. С изменением количества обращений к нему, меняется количество ссылок.
Пример работы __del__()
Деструктор __del__() выводит имя класса того экземпляра, который должен быть уничтожен:
Когда вышеуказанный код выполняется и выводит следующее:
Наследование класса в python
Наследование — это процесс, когда один класс наследует атрибуты и методы другого. Класс, чьи свойства и методы наследуются, называют Родителем или Суперклассом. А класс, свойства которого наследуются — класс-потомок или Подкласс.
Вместо того, чтобы начинать с нуля, вы можете создать класс, на основе уже существующего. Укажите родительский класс в круглых скобках после имени нового класса.
Класс наследник наследует атрибуты своего родительского класса. Вы можете использовать эти атрибуты так, как будто они определены в классе наследнике. Он может переопределять элементы данных и методы родителя.
Синтаксис наследования класса
Классы наследники объявляются так, как и родительские классы. Только, список наследуемых классов, указан после имени класса.