Объектно-ориентированное программирование на Python: классы, описание и характеристики


Опубликованно 18.01.2018 05:44

Объектно-ориентированное программирование на Python: классы, описание и характеристики

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

Что такое классы

Это основные компоненты программного обеспечения ООП. В Python классы используются для реализации новых типов объектов создаются с помощью инструкции class. Внешне они напоминают стандартные встроенные типы данных, такие как числа или последовательности. Но объекты класса есть различие – носитель наследственности.

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

Главная задача классов Python – пакет данных и исполняемого кода. Синтаксически, они похожи на инструкции def. Как функциональность, они создают свои собственные пространства имен, которые могут быть неоднократно вызывать из любой части программы. Тогда зачем они нужны? Классы-это более мощный и универсальный инструмент. Их потенциал раскрывается в момент создания новых объектов.

Важность классы и принцип наследования

Каждый новый объект имеет свое собственное пространство имен, что вы можете программировать, вводить переменные и создать все функции. И есть также атрибуты, унаследованные от класса object.attribute. Это направление ООП.

С помощью наследования, он создает дерево иерархии. На практике это выглядит следующим образом. Когда интерпретатор встречает выражение object.attribute, он начинает поиск первого экземпляра attribute в class. Не найти attribute, интерпретатор продолжает поиск все связанные классы в дереве выше, слева направо.

В дереве поиска включает в себя:суперклассы, которые находятся на вершине иерархии и реализуют поведение в целом;подклассы ниже;экземпляры элементов программы, унаследованные от поведения.

На рисунке изображено дерево классов Python. Из примера видно, что класс 2 и 3 суперклассы. В нижней части расположены два экземпляра в Примере 1 и 2, в середине под-класса 1. Если написать выражение Instance2.w, она будет делать интерпретатор искать значение атрибута .w в следующем порядке:Instance2;Class1;Class2;Class3.

Имя .w будет найден в суперкласс Class3. В терминологии ООП – это означает, что Экземпляр 2 «наследует» атрибута .w Class3.

Пожалуйста, обратите внимание на то, что экземпляры на рисунке наследуют только четыре атрибута: .w, .x .есть и .z:Для экземпляров Instance1.x и Instance2.x атрибута .x будет найден в Class 1, в котором поиск прекращается, потому что класс 1 находится в дереве ниже, чем класс 2.Для Instance1.есть и Instance2.в атрибут .будет найден в 1 класс, в котором поиск прекращается, потому что это единственное место, где он появляется.Для экземпляров Instance1.z и Instance2.z переводчика найти .z в классе 2, потому что он находится в дереве слева Class3.Для Instance2.атрибут name .name будет найден в Instance2 без поиска по дереву.

Последний пункт является самым важным. Он показывает, как Class 1 заменяет атрибут .x, заменив версию .x суперкласса класса 2. Объекты, экземпляры и методы

ООП оперирует двумя главными понятиями: классы и объекты. Классы создают новые типы объектов и классов в языке Python являются их экземпляров. Например, все целые числа, переменные, встроенные в тип данных int. На языке ООП, они являются экземплярами класса int.

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

Существует два типа полей в ООП. Первый-это переменные, принадлежащие всей второй класс переменных экземпляров. Поля и методы в целом, являются атрибутами класса. В Python, они записываются в блоке кода после ключевого слова class.

Методы и значение self

Методы являются функциями дополнительное имя self. Он добавляется в начало списка параметров. Если вы хотите, чтобы переменная, вы можете назвать другое имя, но такая инициатива среди программистов не приветствуется. Self – это стандартные, легко узнаваемый в коде имя. Тем более, работать с ним рассчитываются некоторые среды разработки.

Чтобы лучше понять значение self в ООП, предположим, что у нас есть класс с именем ClassA и метод methodA:>>>class ClassA;def methodA (self, аргумент, аргумент).

Объект objectA-это экземпляр ClassA и вызова метода заключается в следующем:>>>objectA.methodA(аргумент, аргумент).

Когда интерпретатор видит эту строку, он автоматически преобразует его следующим образом: ClassA.methodA(objectA, аргумент, аргумент). Это экземпляр класса использует переменную self, как ссылку на себя.

Как создать переменные, методы и экземпляры классов

Предлагаем разбирать конкретный пример из интерактивной оболочки Python. Создание класса «Экспериментировать» начинается с композитного инструкции class:>>>class Экспериментировать:def setinf(self, value): #создание первого метода с аргументамиself.data = значениеdef display(self): #второй методprint(self.data) #печать данных экземпляра.

После обязательного отступа, блок с инструкции фрс, в том числе два объекта функции назначаются setinf и display. С их помощью создаются атрибуты Экспериментировать.setinf и Экспериментировать.display. На самом деле любое имя, которому присваивается значение на верхнем уровне в суб-блок, становится атрибутом.

Чтобы увидеть, как работают методы, вы должны создать два экземпляра:>>>x = Experimenter () # создает два экземпляра;>>>y = Experimenter () # Все пространство имен.

Первоначально, экземпляры не хранят никакой информации и абсолютно пустыми. Но они связаны с вашего класса:>>>x. setinf(«изучение Python») #Вызов метода self – x.>>>y. setinf(3.14) #Эквивалент: Experimenter.setinf(y, 3.14)

Если через имя экземпляра x, y получить доступ к атрибуту .setinf объект класса Экспериментировать, в результате поиска в дереве наследования интерпретатор возвращает значение атрибута класса.>>>x. display() #x и y значения self.dataУчим Python>>>y. display()3.14.

Перегрузка операторов

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

Рассмотрим действие __init__ и __sub__. Первый метод вызывает конструктор класса. Python __init__, выполняет перегрузка операции создания экземпляров. Второй метод __sub__, реализует операцию вычитания.>>>class Перегрузки: #создает новый классdef __init__(self, start):self.data = startdef __sub__(self, other): # экземпляр менее otherreturn Перегрузки(self.data - other) #Результатом является новый экземпляр>>>A = Перегрузка(10) #__init__(A, 10)>>>B = A – 2 #__sub__(B, 2)>>>B. data #B новый экземпляр класса Перегрузки8.Более подробно о методе __init__

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

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

Методы, унаследованные от супер и не являются обязательными. На начальных этапах, вы можете легко и без них. Но для полного погружения в программирование и суть ООП нужен навык работы с операторами.

Метод __getitem__

Метод __getitem__ выполняет перегрузки доступ к элементу по индексу. Если она унаследована или присутствует в определении класса, при каждой операции индексирования, интерпретатор будет звонить автоматически. Например, когда экземпляр F появляется в выражении извлечения элемента в индекс, такой, что F[i], Python интерпретатор вызывает метод __getitem__, передает объект F в качестве первого аргумента и индекса, указанного в скобках, во втором.

Следующий класс «премьер-министра» возвращает квадрат значение индекса:>>>class премьер-министра:def __getitem__(self, index):возвращение индекса ** 2>>>F = Премьер-Министра ()>>>F[2] #Выражение F[i] называет Ф.__getitem__(i)4>>>for i in range(5):print(F[i], end=« ») # Вызов __getitem__(F, i) на каждой итерации0 1 4 9 16

С помощью этого метода, вы можете выполнить операцию извлечения среза, к которой часто прибегают при работе с последовательностями. При обработке списков стандартный синтаксис операции следующим образом:>>>List = [13, 6, «и», «с», 74,9]>>>Список[2:4][«и», «c»]>>>List[1:][6, «и», «c», 74,9]>>>Список[:-1][13, 6, «и», «c»]>>>Список[::2][13, «и», 74,9]

Класс, который реализует метод __getitem__:>>>class Индексатор:музыка = [13, 6, «и», «с», 74,9]def __getitem__(self, index): #Вызывается при индексации и извлечения срезаprint(«getitem: » индекс)return self.музыка[индекс] #индексирует, или извлечь кусочек>>>X = Indexer()>>>X[0] #в Процессе индексирования, __getitem__, получает целое числоgetitem: 013>>>X[2:4] # При извлечении фрагмента d' __getitem__ возвращает объект срезаgetitem: slice(2, 4, None)[«и», «c»]

Использование атрибутов

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

Удобный метод для общего для обработки запросов к атрибутам:>>>class Gone:def __getattr__(self, atname):if atname == «age»:return 20else:raise AttributeError, atname>>>D = Gone()>>>D. возраст20>>>D. nameAttributeError: name

Класс Gone и его экземпляра D и их атрибуты. Таким образом, при доступе к D. возраст автоматически вызывается метод __getattr__. Экземпляр передается в качестве самостоятельного, и имя неопределенного «возраста» в строке atname. Класс возвращает результат вызова на имя D. возраст, хотя этот атрибут.

Если класс не предназначен для лечения атрибут, метод __getattr__ вызывает встроенный исключение, и передать окружающей среды для получения информации о том, что имя в реальности является неопределенным. В этом случае, при попытке обратиться по имени D. name, вызывает ошибку.

Аналогичным образом, любой метод перегрузки операторов, __setattr__, перехватывая любые попытки присвоить значение атрибута. Если этот способ закреплен в теле класса, термин «self".атрибут = " значение» будет преобразован в вызов метода self.__setattr_(атрибут, значение).

Мы описали только некоторые из существующих способов перегрузки. Весь список-это стандарт-руководство к язык и включает в себя гораздо больше имен.Дополнительные функции

ООП используют иногда сложных и нестандартных задач. С помощью наследования классов в Python, поведение встроенных типов данных и их способности поддаются расширению и адаптации.

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



Категория: Новости Tech