Python объектно ориентированное программирование: концепции, принципы и примеры реализации

Содержание

Объектно-ориентированное программирование в Python — CodeChick

В этой статье мы познакомимся с парадигмой объектно-ориентированного программирования (ООП) и его фундаментальными принципами.

ООП

Python — мультипарадигмальный язык программирования. Он поддерживает разные подходы к программированию.

Один из популярных подходов к решению проблем — создание объектов. Это называется объектно-ориентированным программированием (ООП). 

У объекта есть две характеристики: 

  • атрибуты;
  • поведение.

Рассмотрим пример. Допустим, наш объект — это попугай. У попугая есть такие свойства:

  • Имя, возраст, цвет. Это атрибуты.
  • То, как попугай поет и танцует. Это поведение

ООП предлагает писать код, который можно использовать повторно. Такой принцип называется DRY (don’t repeat yourself, «не повторяйся»).

Класс

Класс — это шаблон объекта.

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

Давайте создадим класс, который описывает попугая: 

class Parrot:
    pass

Для объявления класса Parrot мы использовали ключевое слово class. Из классов мы получаем экземпляры, созданные по подобию этого класса.

Объект

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

Например, экземпляра класса Parrot будет выглядеть так:

# obj — экземпляр класса Parrot
obj = Parrot()

Теперь разберемся, как написать класс и его объекты.

# Создаем класс и его объекты
class Parrot:

    # атрибуты класса
    species = "птица"

    # атрибуты экземпляра
    def __init__(self, name, age):
        self.name = name
        self.age = age

# создаем экземпляра класса
kesha = Parrot("Кеша", 10)
cookie = Parrot("Куки", 15)

# получаем доступ к атрибутам класса
print("Кеша — {}".
format(kesha.__class__.species)) print("Куки тоже {}".format(cookie.__class__.species)) # получаем доступ к атрибутам экземпляра print("{} — {}-летний попугай".format(kesha.name, kesha.age)) print("{} — {} летний попугай".format(cookie.name, cookie.age))

Вывод:

Кеша — птица
Куки тоже птица
Кеша — 10-летний попугай Куки — 15-летний попугай

Мы создали класс Parrot. После этого мы объявили атрибуты — характеристики объекта.

Атрибуты объявлены внутри класса — в методе __init__. Это метод-инициализатор, который запускается сразу же после создания объекта. 

После этого мы создаем экземпляры класса Parrot. kesha и cookie — ссылки на (значения) наши новые объекты. 

Получить доступ к атрибуту класса можно так — __class__.species

. Атрибуты класса для всех экземпляров класса одинаковы. Точно так же мы можем получить доступ к атрибутам экземпляра — kesha. name и kesha.age. Но вот атрибуты каждого экземпляра класса уникальны. 

Подробнее о классах и объектах.

Методы

Методы — функции, объявленные внутри тела класса. Они определяют поведения объекта.

# Создаем метод
class Parrot:
    
    # атрибуты экземпляра
    def __init__(self, name, age):
        self.name = name
        self.age = age
    
    # метод экземпляра
    def sing(self, song):
        return "{} поет {}".format(self.name, song)

    def dance(self):
        return "{} танцует".format(self.name)

# создаем экземпляр класса
kesha = Parrot("Кеша", 10)

# вызываем методы экземпляра
print(kesha.sing("песенки"))
print(kesha.dance())

Вывод:

Кеша поет песенки
Кеша танцует

В этой программе мы объявили два метода: sing() и dance(). Они являются методами экземпляра, потому что они вызываются объектами — например, kesha

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

Наследование — способ создания класса. Его суть заключается в том, что функциональность нового класса наследуются от уже существующего класса. Новый класс называется производным (дочерним). Существующий — базовым (родительским).

# родительский класс
class Bird:
    
    def __init__(self):
        print("Птица готова")

    def whoisThis(self):
        print("Птица")

    def swim(self):
        print("Плывет быстрее")

# дочерний класс
class Penguin(Bird):

    def __init__(self):
        # вызов функции super() 
        super().__init__()
        print("Пингвин готов")

    def whoisThis(self):
        print("Пингвин")

    def run(self):
        print("Бежит быстрее")

peggy = Penguin()
peggy.
whoisThis() peggy.swim() peggy.run()

Вывод:

Птица готова
Пингвин готов
Пингвин
Плывет быстрее
Бежит быстрее

В этой программе мы создаем два класса — Bird (родительский) и Penguin (дочерний). Дочерний класс наследует функции родительского. Это вы можете заметить по методу swim()

.

Но и дочерний класс изменяет функциональность родительского. Это можно заметить по методу whoisThis(). Более того, мы расширяем функциональность родительского класса — создаем метод run().

Также мы используем функцию super() внутри метода __init__(). Это позволяет запускать метод __init__() родительского класса внутри дочернего.

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

Мы можем ограничить доступ к методам и переменным, что предотвратит модификацию данных — это и есть инкапсуляция. Приватные атрибуты выделяются нижним подчеркиванием: одинарным _ или двойным __.  

# Используем инкапсуляцию данных
class Computer:

    def __init__(self):
        self.__maxprice = 900

    def sell(self):
        print("Цена продажи: {}".format(self.__maxprice))

    def setMaxPrice(self, price):
        self.__maxprice = price

c = Computer()
c.sell()

# изменение цены
c.__maxprice = 1000
c.sell()

# используем функцию изменения цены
c.setMaxPrice(1000)
c.sell()

 Вывод:

Цена продажи: 900
Цена продажи: 900
Цена продажи: 1000

Мы объявили класс Computer

Затем мы использовали метод __init__() для хранения максимальной цены компьютера. Затем мы попытались изменить цену — безуспешно: Python воспринимает __maxprice как приватный атрибут. 

Как видите, для изменения цены нам нужно использовать специальную функцию — setMaxPrice(), которая принимает цену в качестве параметра.

Полиморфизм

Полиморфизм — особенность ООП, позволяющая использовать одну функцию для разных форм (типов данных).

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

# Используем полиморфизм
class Parrot:

    def fly(self):
        print("Попугай умеет летать")
    
    def swim(self):
        print("Попугай не умеет плавать")

class Penguin:

    def fly(self):
        print("Пингвин не умеет летать")
    
    def swim(self):
        print("Пингвин умеет плавать")

# общий интерфейс 
def flying_test(bird):
    bird.fly()

# создаем экземпляров класса
kesha = Parrot()
peggy = Penguin()

# передача объектов в качестве аргумента
flying_test(kesha)
flying_test(peggy)

Вывод:

Попугай умеет летать
Пингвин не умеет летать

В этой программе мы объявили два класса:

Parrot и Penguin. В каждом из них описан общий метод fly(). Но функции у них разные. 

Для использование полиморфизма мы создали общий интерфейс — функцию flying_test(). В качестве аргумента она принимает любой объект, после чего происходит вызов его собственного метода fly()

Что нужно запомнить:

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

Почему в Python плохой ООП / Хабр

В Python ужасный ООП. Кликбейтный тезис, который имеет право на существование. Есть много языков, где ООП представлен не в самом классическом виде, ну или так принято считать. Прототипные JavaScript и Lua, Golang с прикреплением методов и прочие. Но «не такой как все» всегда ли синоним слова «неправильный»?  С чего мы вообще вязли, что ООП в Python не такой каким должен быть ООП? Что вообще является точкой отсчёта «правильности» ООП? Smalltalk или Simula 67? Вроде бы объектно-ориентированное программирование – это просто парадигма. . или уже догма?

В этом статье мы попробуем понять:

  • что не так с ООП в Python;

  • чем его ООП отличается от языков с эталонной по мнению многих реализацией ООП: Java, C# и С++;

  • почему разработчики языка Python решили сделать всё именно так.

Реализует этот текст автор YouTube-канала PyLounge Макс. Поехали!

Дисклеймер: В этой статье я хочу высказать свои «рассуждения на тему» и подчёркиваю, что не обладаю монополией на истину. Буду рад осудить альтернативное мнение в комментариях.

Для начала необходимо понять. Чем ООП в Python отличается от классической концепции и реализации в других ЯП.

Парадигма ООП появилась ещё 60-70-х годах XX века. ООП или Объектно-ориентированное программирование — это методология программирования, которая основана представлении программы в виде набора взаимодействующих объектов, каждый из которых является экземпляром класса, а классы образуют иерархию наследования.

Ключевыми особенностями ООП является понятия:

  • абстракция; 

  • инкапсуляция; 

  • наследование; 

  • полиморфизм.

Алан Кэй, создателя языка Smalltalk, одним из «отцов-основателей» ООП, говорил, что ООП подход заключается в следующем наборе принципов:

  1. Всё является объектом.

  2. Вычисления осуществляются путём взаимодействия (обмена данными) между объектами, при котором один объект требует, чтобы другой объект выполнил некоторое действие.

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

  4. Каждый объект является представителем класса, который выражает общие свойства объектов (таких, как целые числа или списки).

  5. В классе задаётся поведение (функциональность) объекта. Тем самым все объекты, которые являются экземплярами одного класса, могут выполнять одни и те же действия.

  6. Классы организованы в единую древовидную структуру с общим корнем, называемую иерархией наследования. Память и поведение, связанное с экземплярами определённого класса, автоматически доступны любому классу, расположенному ниже в иерархическом дереве.

«ООП для меня означает лишь обмен сообщениями, локальное сохранение, и защита, и скрытие состояния, и крайне позднее связывание». (c) Алан Кэй

Другими словами, в соответствии с идеями Алана Кэя, самыми важными ингредиентами ООП является:

  1. Передача сообщений (то есть взаимодействие).

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

  3. Динамическое связывание.

Интересно, что указывается именно термин связывание, а терминов наследование и полиморфизм нет. Ведь полиморфизм бывает статический (раннее связывание) – это перегрузки и дженерики (шаблоны).  То есть Кэй, человек, который считается изобретателем термина «ООП» не считал важными частями ООП наследование и полиморфизм. Получается пропорции условны, а границы размыты.

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

Все остальное же было определено, когда появились объектно-ориентированные языки. Языки OO были разработаны, чтобы упростить подход к программированию. И они реализовали инструменты и функции для поддержки ООП — классы были одним из таких инструментов.

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

Например, в Java можно определить поле как приватное, и тогда оно будет видно только членам этого класса. Также работает и С++, однако там есть концепция друзей (friend), которые могут видеть приватные поля других классов, что сильно критикуется.

Наследование — свойство системы, позволяющее описать новый класс на основе уже существующего с частично или полностью заимствованной функциональностью.

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

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

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

В центре ООП находится понятие объекта. Объект — это сущность, которой можно посылать сообщения и которая может на них реагировать, используя свои данные. Объект — это экземпляр класса. Данные объекта содержатся в объекте, а не просто лежат внутри программы. Инкапсуляция включает в себя сокрытие (но им не является!).

ООП пытается сделать программное обеспечение похожим на «реальный мир», как его может понять обычный человек.

Современная идея ООП — это синтез всех их идей, а также идей Голдберга, Барбары Лисков, Дэвида Парнаса, Бертрана Мейера, Гюля Ага и других. Но никто из них не может утверждать, что же такое «ООП». Термины развиваются, как и задачи, которые изначально эти инструменты должны были решать.

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

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

Отсутствие модификаторов доступа

В Python отсутствует деление на публичные, защищённые, приватные свойства и методы.  Многие вещи в Python основаны на соглашениях. Сокрытие данных реализуется чисто конвенционально. За счёт соглашения использовать подчёркивание у свойств и методов (защищённые члены). Да, можно использовать двойное подчёркивание, так называемый манглинг. Чисто технически это запрещает прямой доступ к данным и равносильно модификатору приват, но это скорее придуманный адептами классического ООП «грязный хак». Таким образом, в Python нет классического разделения на группы доступа, потому что Python доверяет разработчику. В этом плане Python ближе к С++.

«Да, я знаю, что ты можешь выстрелить себе в ногу, но я верю, что ты этого не сделаешь. Ведь не даром ты столько узнал, прежде чем приступить к написанию кода». (с) Python

Мне кажется, инкапсуляция не так полезна в языке с динамической типизацией.  Выскажу непопулярное мнение – это не добавляет никакой безопасности, она просто дает ощущение безопасности. Если вы грамотный программист, то так или иначе сделаете всё как надо.

Но почему разработчики языка не добавили такой привычный «предохранитель»? Ответ кроется в философии Python. Гвидо не любит что-то скрывать. Как он выразился в одном интервью: «мы все здесь взрослые по обоюдному согласию. Python доверяет вам. Он говорит: «Эй, если хочешь чтобы ковыряться в темных местах, я надеюсь, что у тебя есть уважительная причина, и вы не создаете проблем». Этого тезиса мы ещё коснёмся ниже. Пока просто запомните.

Вообще инкапсуляция – это не совсем про сокрытие. Инкапсуляция определяется как «процесс объединения элементов данных и функций в единое целое, называемое классом» или «отделение реализации от описания». Таким образом, номинально в Python всё соблюдается более чем верно.

Отсутствие интерфейсов

В языке Python нет как таковой конструкции как интерфейс (interface). К слову в С++ их тоже нет. Но что в Python, что в С++, есть механизмы, позволяющие так или иначе использовать интерфейсы.  Абстрактные классы ­– это хоть и немного другое, но функционалу отвечает и допускает некоторое упрощение концепции. На мой взгляд, отсутствие интерфейсов искусственный механизм избежания неоднозначности. Вот у тебя есть абстрактные классы, вот их и используй. С помощью абстрактных классов можно сделать всё тоже что и с интерфейсами, но не надо заморачиваться. Ведь Python идёт по пути простоты и убирает всё лишнее. Создатели языка даже конструкцию switch case выкинули, дабы «место не занимала».

Множественное наследование

Многие современные языки отказываются от множественного наследования, так как оно многое усложняет. Однако Python хоть и идёт по пути упрощения, но старается выкидывать избыточность, а не функциональность, ведь любое упрощение — это потеря гибкости + см. пункт про доверие своему разработчику. Python думает, что разработчик, который его использует достаточно умён, чтобы не плодить гигантскую иерархию и победить проблему ромба. Не доверился он разве что, при создании GIL. Но спишем это на ошибки молодости. Кстати, С++ также поддерживает множественное наследование. Так что с этим пунктом всё тоже в рамках закона.

Утиная типизация

Она, конечно, к теме относится косвенно. Но, тем не менее, рядом с Python всегда всплывает понятие утиной типизации.  

Если что-то выглядит как утка, плавает как утка и крякает как утка, это наверняка и есть утка.

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

Тут во всей красе демонстрируется один из главных принципов Дзена Python«явное лучше, чем неявное». Если что-то выглядит как утка и крякает, то это утка, к чему погружаться в экзистенциальные копания и вопросы самоопределения? Будь проще и посмотри пример.

Поскольку Duck и Human это разные классы, Python повторно вызывает функцию fly_quack() для экземпляра класса Human. И хотя класс Human имеет похожие методы quack и fly , типы объектов были разными и поэтому все работает правильно и вызываются верные методы.

Константные методы

Нет способов предотвратить изменение состояния класса методами класса (константные методы), снова всё полагается на добрую волю программиста.

Вообще докопаться ещё можно много до чего. Например, не совсем стандартное описание статических методов и свойств, параметр self, MRO и многое многое другое.

Но Python отвечает всем требованиям парадигмы ООП. Просто многие моменты выполнены не так как у всех. Но на то есть причины.  Гвидо ван Россум при разработке дизайна языка мотивировался выработанным им Дзеном Python, где простое лучше, чем сложное, явное лучше не явного и т. д. Через эту философию красной нитью проходит структура всего языка Python.

The Zen of Python

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

По мнению многих Smalltalk — самый чистый ООП язык, но что даёт и какова цена этой чистоты? Можно написать очень хороший объектно-ориентированный код как на Smalltalk, так и на Python.

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

Есть языки, которые идут по одному из двух векторов развития: доверяют разработчику, дают средства и возможности, за что он может заплатить неправильностью своих решений. И языки, которые по максимуму всё запрещают, чтобы писать было просто и топорно. Все решения давно приняты за тебя, всем известно как делать правильно, например, Golang. С такой точки зрения «Почти все «фичи» — это сахарная кола, а программирование — это толстяк с диабетом»».

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

Python похож на ту маму, которая позволит вам тусоваться с плохими детьми поздно ночью, если вы осознаете последствия.

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

Это извечная дилемма: что лучше авторитарная стабильность или нестабильная свобода? Каждый человек отвечает на этот вопрос сам. Так же, как и выбирает подходящий для себя инструмент – язык программирования.

ООП в Python не лучше и не хуже, чем в других языка. Он другой. Такой каким концептуально его видел главный разработчик языка Гвидо ван Россум. ООП в Python это часть Дзена Python. Философии, для которой язык и был разработан.

Проблема в том, что люди пытаются перенять подходы из других языков, а не учатся использовать уникальные сильные стороны Python. У Python довольно надежная объектная модель, но это объектная модель Python, а не C++, Java или…кого-то другого.

Не динамическая типизация, корявый ООП и большое количество библиотек порождают говонокод. Говнокод порождают люди. Люди, которых не интересуют инженерные практики, которые лезут в профессию исключительно за деньгами и не видят в программировании своего ремесла, и, безусловно, те люди, которых привлекает низкий порог вхождения.

А Python просто сейчас очень популярен. Он своего рода фронтмен, а тот кто на передовой, того обычно и критикуют. И да, я понимаю, что Python стремится быть как можно более простым, как завещал Эйнштейн: «все должно быть настолько простым, насколько это возможно, но не проще». Однако иногда Python всё же попадает в это «проще» чем надо, что может выливаться в проблемы.

Python получает важные обновления по ходу игры, потому что изначально задумывался как простенький язык сценариев (а там чем меньше церемоний, тем лучше).

Дизайн языка потихоньку меняется. Аннотации типов, разного рода оптимизации говорят о том, что язык и сообщество взрослеют и зреют. Python со времён 2 версии уже сильно изменился и будет продолжать меняться. Как молодой бунтарь контркультуртурщик под призмой времени превращается в консерватора и прагматика, также и Python превратится просто в стабильный качественный инструмент. А на смену ему придёт новая рок-звезда, которая будет вертеть устои инженерной культуры и привлекать школьников.

То, что код превращается в беспорядок, — это ваша вина, а не вина языка. И именно таким и должен быть хороший язык: инструментом, помогающим решать ваши проблемы, а не диктатором, который покровительствует вам, что-то запрещает, командует вами.

Если мы напишем язык, который смогут использовать идиоты, в конце концов, только идиоты и будут его использовать. И да, это цена, которую придётся заплатить.


Закончу мысль довольно известной фразой: «Есть всего два типа языков программирования: те, на которые люди всё время ругаются, и те, которые никто не использует».

Python OOP Concepts — GeeksforGeeks

В Python объектно-ориентированное программирование (ООП) — это парадигма программирования, использующая объекты и классы в программировании. Он направлен на реализацию в программировании реальных объектов, таких как наследование, полиморфизмы, инкапсуляция и т. д. Основная концепция ООП состоит в том, чтобы связать данные и функции, которые работают с ними, вместе как единое целое, чтобы никакая другая часть кода не могла получить доступ к этим данным.

Основные концепции объектно-ориентированного программирования (ООП) 

  • Класс
  • Объекты
  • Полиморфизм
  • Инкапсуляция
  • Наследство
  • Абстракция данных

OOPS

Класс

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

Чтобы понять необходимость создания класса, давайте рассмотрим пример. Допустим, вы хотите отслеживать количество собак, которые могут иметь разные атрибуты, такие как порода, возраст. Если используется список, первым элементом может быть порода собаки, а вторым элементом может быть ее возраст. Предположим, есть 100 разных собак, тогда как узнать, какой элемент должен быть каким? Что, если бы вы захотели добавить этим собакам другие свойства? Этому не хватает организации, и это именно то, что нужно для занятий.

Некоторые моменты в классе Python:  

  • Классы создаются по ключевому слову class.
  • Атрибуты — это переменные, принадлежащие классу.
  • Атрибуты всегда общедоступны, и к ним можно получить доступ с помощью оператора точка (.). Например: Myclass.Myattribute

Синтаксис определения класса:

 class ClassName:
   # Заявление-1
   .
   .
   .
   # Заявление-N 

Пример: Создание пустого класса в Python

Python

Класс DOG:

Pass

В примере вышеуказанный пример, мы создаем A Class Sword.

Объекты

Объект — это сущность, с которой связано состояние и поведение. Это может быть любой объект реального мира, такой как мышь, клавиатура, стул, стол, ручка и т. д. Целые числа, строки, числа с плавающей запятой, даже массивы и словари — все это объекты. Более конкретно, любое целое число или любая отдельная строка является объектом. Число 12 — это объект, строка «Hello, world» — это объект, список — это объект, который может содержать другие объекты, и так далее. Вы все время использовали объекты и, возможно, даже не осознавали этого.

Объект состоит из:

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

Чтобы понять состояние, поведение и идентичность, давайте возьмем пример класса собак (объяснено выше).

  • Личность можно рассматривать как имя собаки.
  • Состояние или Атрибуты могут рассматриваться как порода, возраст или окрас собаки.
  • По поведению можно судить о том, ест собака или спит.

Пример: Создание объекта

Python3

OBJ = DOG ()

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

The self   
  1. Методы класса должны иметь дополнительный первый параметр в определении метода. Мы не даем значение этому параметру при вызове метода, его предоставляет Python
  2. Если у нас есть метод, который не принимает аргументов, то нам все равно нужно иметь один аргумент.
  3. Это похоже на этот указатель в C++ и эту ссылку в Java.

Когда мы вызываем метод этого объекта как myobject. method(arg1, arg2), он автоматически преобразуется Python в MyClass.method(myobject, arg1, arg2) — это все, что касается специального self.

Примечание: Дополнительные сведения см. в разделе self в классе Python. Он запускается, как только создается экземпляр объекта класса. Этот метод полезен для любой инициализации, которую вы хотите выполнить с вашим объектом.

Теперь давайте определим класс и создадим несколько объектов, используя метод self и __init__.

Пример 1: Создание класса и объекта с атрибутами класса и экземпляра

Python3

class Dog:

 

    

     attr1 = "mammal"

 

    

     def __init__( self , name):

         self . name = 0 name0003

 

Rodger = Dog( "Rodger" )

Tommy = Dog( "Tommy" )

 

print ( "Rodger is a {}" . format (Rodger.__class__.attr1))

print ( "Tommy is also a {}" . format (Tommy.__class__.attr1))

 

print ( "My name is {}" . format (Rodger.name))

print ( "Меня зовут {}" . формат (Tommy.name))

Выход 63 млекопитающее Роджер Томми тоже млекопитающее Меня зовут Роджер Меня зовут Томми

Пример 2: Создание класса и объектов с помощью методов

Python3

class Dog:

 

    

     attr1 = "mammal"

 

    

     def __init__( self , name):

         self . name = 0 name0003

          

     def speak( self ):

         print ( "My name is {}" . format ( self .name))

 

Rodger = Dog( "Rodger" )

Tommy = Dog( "Tommy" )

 

Rodger.speak()

Tommy.speak()

Output

 My name is Rodger
Меня зовут Томми 

Примечание. Для получения дополнительной информации см. раздел Классы и объекты Python

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

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

  • Хорошо отображает отношения в реальном мире.
  • Обеспечивает возможность повторного использования кода. Нам не нужно писать один и тот же код снова и снова. Кроме того, это позволяет нам добавлять дополнительные функции в класс, не изменяя его.
  • Он транзитивен по своей природе, что означает, что если класс B наследуется от другого класса A, то все подклассы B автоматически наследуются от класса A.0022 :
    Одноуровневое наследование позволяет производному классу наследовать характеристики однородного класса.

    Многоуровневое наследование:
    Многоуровневое наследование позволяет производному классу наследовать свойства непосредственного родительского класса, который, в свою очередь, наследует свойства родительского класса.

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

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

    Example: Inheritance in Python

    Python3

     

    class Person( object ):

     

        

         def __init__( сам , имя, идентификационный номер):

             self .name = name

             self . idnumber = idnumber

     

         def display( self ):

    Печать ( Self . Печать

    0060 ( self .idnumber)

              

         def details( self ):

             print ( "My name is { } " . Формат ( Self .name))

    Печать ( " IDNUMB0059 format ( self . idnumber))

          

    class Employee(Person):

         def __init__( self , name, idnumber , зарплата, почта):

    Self .SALARY = САРЬ

    Self .POST

    = .0060 post

     

            

             Person.__init__( self , name, idnumber)

              

         def details( self ) :

             печать ( "Меня зовут {}" . формат

    9 (

      0 собственн..name))

      Печать ( "Idnumber: {}" . формат ( Self .idnumb "Post: {}" . format ( self .post))

       

       

      a = Employee( 'Rahul' , 886012 , 200000 , "Intern" )

       

      a.display()

      a.details()

    Выход

     Рахул
    886012
    Меня зовут Рахул
    Идентификационный номер: 886012
    Сообщение: Intern 

    В приведенной выше статье мы создали два класса: Person (родительский класс) и Employee (дочерний класс). Класс Employee наследуется от класса Person. Мы можем использовать методы класса person через класс сотрудников, как показано в функции отображения в приведенном выше коде. Дочерний класс также может изменить поведение родительского класса, как видно из метода details().

    Примечание: Для получения дополнительной информации обратитесь к нашему руководству по наследованию в Python.

    Полиморфизм

    Полиморфизм просто означает наличие множества форм. Например, нам нужно определить, летают ли данные виды птиц или нет, используя полиморфизм, мы можем сделать это с помощью одной функции. Пример: полиморфизм в Python0058 DEF Intro ( Self ):

    Печать ( ». Полет ( Self ):

    Печать ( "Большинство птиц могут летать, но некоторые не могут. 0003

    class sparrow(Bird):

        

         def flight( self ):

             print ( "Sparrows can fly. " )

    Класс Страус (птица):

    DEF ( Self

    9): ( Self

    ): )0060

             print ( "Ostriches cannot fly." )

     

    obj_bird = Bird()

    obj_spr = sparrow()

    obj_ost = ostrich()

     

    obj_bird. intro()

    obj_bird.flight()

     

    obj_spr.intro()

    obj_spr.flight()

     

    obj_ost.intro()

    obj_ost.flight()

    Output

     There are many types птиц.
    Большинство птиц могут летать, но некоторые не могут.
    Есть много видов птиц.
    Воробьи умеют летать.
    Есть много видов птиц.
    Страусы не умеют летать. 

    Примечание: Для получения дополнительной информации обратитесь к нашему учебнику по полиморфизму в Python.

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

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

    Класс является примером инкапсуляции, поскольку он инкапсулирует все данные, которые являются функциями-членами, переменными и т. д.

    Example: Encapsulation in Python

    Python3

     

    class Base:

         def __init__( self ):

             Self .A = "Geeksforgeeks"

    Self . __ C = "Geeksforgeeks"0060

     

    class Derived(Base):

         def __init__( self ):

     

            

            

             Base. __init__( self )

             print ( "Вызов частного члена базового класса: "

    0 )

             print ( self .__c)

     

     

    obj1 = Base()

    print (obj1. a)

     

     

    Вывод

     GeeksforGeeks 

    В приведенном выше примере мы создали переменную c в качестве закрытого атрибута. Мы даже не можем получить доступ к этому атрибуту напрямую и даже не можем изменить его значение.

    Примечание: для получения дополнительной информации см. в нашем руководстве по инкапсуляции в Python.

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

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

    Абстракция данных в Python может быть достигнута путем создания абстрактных классов.

    Объектно-ориентированное программирование на Python | Набор 2 (скрытие данных и печать объектов)

    https://youtu.be/CiH7lN4

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

    Объектно-ориентированное программирование на Python

    Эта серия Python OOP содержит следующее подробное руководство . Вы можете напрямую прочитать их.

    • Классы и объекты в Python : вы поймете, как реализовать объектно-ориентированные программы, создавая классы и объекты.
    • Конструкторы в Python : узнайте, как создать конструктор для инициализации объекта в Python. создавать различные типы конструкторов.
    • Деструкторы Python для уничтожения объекта : Научитесь создавать деструктор в Python, чтобы освобождать объект других ресурсов, которые он использовал.
    • Инкапсуляция в Python : Научитесь реализовывать инкапсуляцию в Python с помощью класса. внедрить скрытие данных с использованием общедоступных, защищенных и частных членов
    • Полиморфизм в Python : Научитесь реализовывать полиморфизм в Python, используя перегрузку функций, переопределение методов и перегрузку операторов.
    • Наследование в Python : Научитесь реализовывать наследование в Python. Кроме того, изучите типы наследования и MRO (порядок разрешения методов).
    • Переменные экземпляра Python : Научитесь создавать и получать доступ к переменным экземпляра. Измените значения переменных экземпляра. Поймите, как динамически мы можем добавлять или удалять переменные экземпляра из объекта
    • Методы экземпляра Python : научитесь создавать и вызывать методы экземпляра. Поймите, как динамически мы можем добавлять или удалять методы экземпляра из объекта
    • .
    • Переменные класса Python : Научитесь создавать, изменять и получать доступ к переменным класса. Поймите разницу между переменными экземпляра и переменными класса.
    • Метод класса Python : научитесь создавать и вызывать методы класса. Создайте метод класса, используя декоратор @classmethod и функцию classmethod()
    • .
    • Статический метод Python : научитесь создавать и вызывать статические методы. Создайте статический метод с помощью декоратора @staticmethod и функции staticmethod()
    • Метод класса Python, статический метод и метод экземпляра : поймите разницу между всеми тремя методами класса
    • ООП-упражнение Python . Решите это упражнение, чтобы попрактиковаться и понять концепции ООП.

    Что такое объектно-ориентированное программирование в Python

    Объектно-ориентированное программирование (ООП) — это парадигма программирования, основанная на концепции « объектов ». Объект содержит как данные, так и код: данные в виде свойств (часто называемых атрибутами) и код в виде методов (действия, которые может выполнять объект).

    Объектно-ориентированная парадигма заключается в разработке программы с использованием классов и объектов. Язык программирования Python поддерживает различные подходы к программированию, такие как функциональное программирование, модульное программирование. Одним из популярных подходов является объектно-ориентированное программирование (ООП) для решения проблемы программирования путем создания объектов 9.0003 Концепции Python OOP

    Объект имеет следующие две характеристики:

    • Атрибут
    • Поведение

    Например, Автомобиль является объектом, так как он имеет следующие свойства:

    • название, цена, цвет как атрибуты
    • поломка, ускорение как поведение

    Одним из важных аспектов ООП в Python является создание повторно используемого кода с использованием концепции наследования. Эта концепция также известна как DRY (не повторяйтесь).

    Класс и объекты

    В Python все является объектом. Класс — это схема объекта . Чтобы создать объект, нам нужна модель, план или чертеж, который представляет собой не что иное, как класс.

    Например, вы создаете автомобиль по чертежу (шаблону) автомобиля. План содержит все размеры и структуру. Основываясь на этих описаниях, мы можем построить автомобиль, грузовик, автобус или любое транспортное средство. Здесь легковой автомобиль, грузовик, автобус являются объектами 9 класса транспортного средства.0003

    Класс содержит свойства (атрибут) и действие (поведение) объекта. Свойства представляют собой переменные, а методы представляют собой действия. Следовательно, класс включает в себя как переменные, так и методы.

    Класс и объекты Python

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

    Подробнее : Классы и объекты в Python

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

    При разработке класса мы используем переменные экземпляра и переменные класса.

    В классе атрибуты могут быть разделены на две части:

    • Переменные экземпляра: Переменные экземпляра — это атрибуты, прикрепленные к экземпляру класса. Мы определяем переменные экземпляра в конструкторе (метод __init__() класса).
    • Переменные класса: переменная класса — это переменная, объявленная внутри класса, но вне любого метода экземпляра или __init()__ метод.

    Внутри класса мы можем определить следующие три типа методов.

    • Метод экземпляра : Используется для доступа или изменения атрибутов объекта. Если мы используем переменные экземпляра внутри метода, такие методы называются методами экземпляра.
    • Метод класса : Используется для доступа или изменения состояния класса. В реализации метода, если мы используем только переменные класса, то такой тип методов мы должны объявить как метод класса.
    • Статический метод : это общий служебный метод, который выполняет задачу изолированно. Внутри этого метода мы не используем переменную экземпляра или класса, потому что этот статический метод не имеет доступа к атрибутам класса.

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

    Создание класса и объектов

    В Python используйте ключевое слово class для определения класса. В определении класса первой строкой является docstring, представляющая собой краткое описание класса.

    Строка документации не является обязательной, но рекомендуется к использованию. Мы можем получить строку документации, используя атрибут __doc__ . Используйте следующий синтаксис для создания класса .

    Синтаксис

     класс classname:
        '''строка документации'''
       class_suite 
    • Строка документации : представляет описание класса . Это необязательно.
    • class_suite : class suite содержит атрибуты и методы класса

    Мы можем создать любое количество объектов класса. используйте следующий синтаксис для создания объекта класса.

     reference_variable = classname() 

    Пример ООП: создание класса и объекта в Python

     class Сотрудник:
        # переменные класса
        company_name = 'Компания ABC'
    
        # конструктор для инициализации объекта
        def __init__(я, имя, зарплата):
            # переменные экземпляра
            self.name = имя
            собственная зарплата = зарплата
    
        # метод экземпляра
        деф-шоу (я):
            print('Сотрудник:', self.name, self.salary, self.company_name)
    
    # создаем первый объект
    emp1 = Сотрудник ("Гарри", 12000)
    emp1.show()
    
    # создаем второй объект
    emp2 = Сотрудник("Эмма", 10000)
    emp2.show()
     

    Выход :

     Сотрудник: Гарри 12000 ABC Company
    Сотрудник: Эмма 10000 ABC Company 
    • В приведенном выше примере мы создали класс с именем Сотрудник.
    • Далее мы определили два атрибута имя и зарплата.
    • Далее в методе __init__() мы инициализировали значение атрибутов. Этот метод вызывается сразу после создания объекта. Метод init инициализирует объект.
    • Наконец, из класса Employee мы создали два объекта, Эмму и Гарри.
    • Используя объект, мы можем получить доступ и изменить его атрибуты.
    переменные и методы экземпляра

    Конструкторы в Python

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

    Основная цель конструктора — объявить и инициализировать переменные экземпляра. Он может принимать по крайней мере один аргумент равный 9.0059 сам . Метод __init()__ называется конструктором в Python. Другими словами, имя конструктора должно быть __ init __ (self) .

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

    Подробнее :

    • Конструкторы в Python
    • деструкторов Python для уничтожения объекта

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

    В Python инкапсуляция — это метод объединения данных и функций в единую сущность. Например, класс A инкапсулирует все данные (методы и переменные). Инкапсуляция означает, что внутреннее представление объекта обычно скрыто от внешнего определения объекта.

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

    Необходимость инкапсуляции

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

    Прочтите полное руководство по инкапсуляции в Python .

    Пример: инкапсуляция в Python

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

    В Python у нас нет модификаторов доступа, таких как public, private и protected. Но мы можем добиться инкапсуляции, используя префикс single 9.0022 подчеркивание и двойное подчеркивание для управления доступом к переменной и методу в программе Python.

     класс Сотрудник:
        def __init__(я, имя, зарплата):
            # публичный член
            self.name = имя
            # закрытый участник
            # недоступно вне класса
            self.__salary = зарплата
    
        деф-шоу (я):
            print("Имя ", self.name, "и зарплата", self.__salary)
    
    emp = Сотрудник("Джесса", 40000)
    emp.show()
    
    # доступ к зарплате вне класса
    print(emp.__salary)
     

    Выход :

     Имя Джесса и зарплата 40000
    AttributeError: объект «Сотрудник» не имеет атрибута «__salary» 

    В приведенном выше примере мы создаем класс с именем Сотрудник . В этом классе мы объявляем две переменные , имя и __salary . Мы можем заметить, что переменная name доступна, но __salary является частной переменной . Мы не можем получить к нему доступ извне класса. Если мы попытаемся получить к нему доступ, мы получим ошибку

    Полиморфизм в Python

    Полиморфизм в ООП — это способность объекта принимать множество форм . Проще говоря, полиморфизм позволяет нам выполнять одно и то же действие разными способами.

    Полиморфизм происходит от греческих слов Poly (много) и morphism (формы). Полиморфизм определяет способность принимать различные формы.

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

    Полиморфизм Python

    Прочтите полное руководство по полиморфизму в Python .

    Пример: использование полиморфизма в Python

    Например, в приведенном ниже примере метод экземпляра calculate_area() создан как в классе Circle, так и в классе Rectangle. Таким образом, мы можем создать функцию, которая берет любой объект и вызывает метод calculate_area() объекта для реализации полиморфизма. Использование этого объекта может выполнять

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

     класс Круг:
        пи = 3,14
    
        def __init__(я, редиус):
            self.radius = редиус
    
        def calculate_area (я):
            print("Площадь круга:", self.pi * self.radius * self.radius)
    
    класс Прямоугольник:
        def __init__(я, длина, ширина):
            собственная длина = длина
            собственная ширина = ширина
    
        def calculate_area (я):
            print("Площадь прямоугольника:", self. length * self.width)
    
    # функция
    площадь защиты (форма):
        # действие вызова
        shape.calculate_area()
    
    # создать объект
    круг = круг (5)
    прямоугольник = прямоугольник (10, 5)
    
    # вызов общей функции
    площадь (окр)
    площадь (прямая)
     

    Выход :

     Площадь круга : 78,5
    Площадь прямоугольника: 50 

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

    В объектно-ориентированном языке программирования наследование является важным аспектом. В Python наследование — это процесс наследования свойств родительского класса дочернему классу.

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

    Синтаксис

     class BaseClass:
      Тело базового класса
    класс DerivedClass (базовый класс):
      Тело производного класса 

    Прочтите полное руководство по Наследование в Python

    Пример: использование наследования в Python

    в приведенном ниже примере.

Оставить комментарий

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *