Метод str ооп python

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

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

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

Есть вопросы по Python?

На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!

Telegram Чат & Канал

Вступите в наш дружный чат по Python и начните общение с единомышленниками! Станьте частью большого сообщества!

Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!

Один из очевидных ответов на этот вопрос — гоночный болид. Условный болид может обладать такими характеристиками как:

Соответственно, болид можно запустить, остановить, ускорить, и так далее. Гонщик может быть еще одним объектом в Формуле-1. Гонщик имеет национальность, возраст, пол, и так далее, кроме этого, он обладает таким функционалом, как управление болидом, рулевое управление, переключение передач.

Как и в этом примере, в объектно-ориентированном программировании мы создадим объекты, которые будут соответствовать реальным аспектам.

Стоит обратить внимание на то, что объектно-ориентированное программирование — не зависящая от языка программирования концепция. Это общая концепция программирования и большинство современных языков, такие как Java, C#, C++ и Python поддерживают объектно-ориентированное программирование.

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

Преимущества и недостатки ООП Python

Рассмотрим несколько основных преимуществ объектно-ориентированного программирования:

  1. Объектно-ориентированное программирование подразумевает повторное использование. Компьютерная программа написанная в форме объектов и классов может быть использована снова в других проектах без повторения кода;
  2. Использование модулярного подхода в объектно-ориентированном программировании позволяет получить читаемый и гибкий код;
  3. В объектно-ориентированном программировании каждый класс имеет определенную задачу. Если ошибка возникнет в одной части кода, вы можете исправить ее локально, без необходимости вмешиваться в другие части кода;
  4. Инкапсуляция данных (которую мы рассмотрим дальше в статье) вносит дополнительный уровень безопасности в разрабатываемую программу с использованием объектно-ориентированного подхода;

Хотя объектно-ориентированное программирование обладает рядом преимуществ, оно также содержит определенные недостатки, некоторые из них находятся в списке ниже:

  1. Для создания объектов необходимо иметь подробное представление о разрабатываемом программном обеспечении;
  2. Не каждый аспект программного обеспечения является лучшим решением для реализации в качестве объекта. Для новичков может быть тяжело прочертить линию в золотой середине;
  3. С тем, как вы вносите все новые и новые классы в код, размер и сложность программы растет в геометрической прогрессии;

В следующем разделе мы рассмотрим ряд самых важных концепций объектно-ориентированного программирования.

Как и следует из названия, объектно-ориентированное программирование — это речь об объектах. Однако, перед тем как создать объект, нам нужно определить его класс.

Класс

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

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

Отношение между классом и объектом можно представить более наглядно, взглянув на отношение между машиной и Audi. Да, Audi – это машина. Однако, нет такой вещи, как просто машина. Машина — это абстрактная концепция, которую также реализуют в Toyota, Honda, Ferrari, и других компаниях.

Ключевое слово class используется для создания класса в Python. Название класса следует за ключом class , за которым следует двоеточие. Тело класса начинается с новой строки, с отступом на одну вкладку влево.

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

Источник

Магические методы __str__, __repr__, __len__, __abs__

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

Как я говорил, их еще называют

dunder-методами (от англ. сокращения double underscope)

  • __str__() – магический метод для отображения информации об объекте класса для пользователей (например, для функций print, str);
  • __repr__() – магический метод для отображения информации об объекте класса в режиме отладки (для разработчиков).
class Cat: def __init__(self, name): self.name = name

При выводе cat, увидим служебную информацию: Если нам нужно ее как-то переопределить и отобразить в другом виде (формате), то, как раз для этого используются магические методы __str__ и __repr__. Давайте для начала переопределим метод __repr__ и посмотрим, как это отразится на выводе служебной информации о классе:

def __repr__(self): return f": "

Обратите внимание, этот метод должен возвращать строку, поэтому здесь записан оператор return и формируемая строка. Что именно возвращать, мы решаем сами, в данном случае – это название класса и имя кошки. Переопределим измененный класс Cat. И, смотрите, теперь при создании экземпляра мы видим другую информацию при его выводе: : Васька Как раз то, что определили в магическом методе __repr__. То же самое увидим и при использовании функции print и str. По идее, здесь должен отрабатывать другой магический метод __str__, но так как он у нас еще не переопределен, то автоматически выполняется метод __repr__. Давайте добавим второй магический метод __str__ и посмотрим, как это повлияет на отображение данных:

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

Магические методы __len__ и __abs__

  • __len__() – позволяет применять функцию len() к экземплярам класса;
  • __abs__() — позволяет применять функцию abs() к экземплярам класса.
class Point: def __init__(self, *args): self.__coords = args

А, далее, по программе нам бы хотелось определять размерность координат с помощью функции len(), следующим образом:

Если сейчас запустить программу, то увидим ошибку, так как функция len не применима к экземплярам классов по умолчанию. Как вы уже догадались, чтобы изменить это поведение, можно переопределить магический метод __len__() и в нашем случае это можно сделать так:

def __len__(self): return len(self.__coords)

Смотрите, мы здесь возвращаем размер списка __coords и если после этого запустить программу, то как раз это значение и будет выведено в консоль. То есть, магический метод __len__ указал, что нужно возвращать, в момент применения функции len() к экземпляру класса. Как видите, все просто и очевидно. Следующий магический метод __abs__ работает аналогичным образом, только активируется в момент вызова функции abs для экземпляра класса, например, так:

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

def __abs__(self): return list( map(abs, self.__coords) )

Источник

Методы __str__, __repr__#

Специальные методы __str__ и __repr__ отвечают за строковое представления объекта. При этом используются они в разных местах.

Рассмотрим пример класса IPAddress, который отвечает за представление IPv4 адреса:

In [1]: class IPAddress: . : def __init__(self, ip): . : self.ip = ip . : 

После создания экземпляров класса, у них есть строковое представление по умолчанию, которое выглядит так (этот же вывод отображается при использовании print):

In [2]: ip1 = IPAddress('10.1.1.1') In [3]: ip2 = IPAddress('10.2.2.2') In [4]: str(ip1) Out[4]: '' In [5]: str(ip2) Out[5]: '' 

К сожалению, это представление не очень информативно. И было бы лучше, если бы отображалась информация о том, какой именно адрес представляет этот экземпляр. За отображение информации при применении функции str, отвечает специальный метод __str__ — как аргумент метод ожидает только экземпляр и должен возвращать строку

In [6]: class IPAddress: . : def __init__(self, ip): . : self.ip = ip . : . : def __str__(self): . : return f"IPAddress: self.ip>" . : In [7]: ip1 = IPAddress('10.1.1.1') In [8]: ip2 = IPAddress('10.2.2.2') In [9]: str(ip1) Out[9]: 'IPAddress: 10.1.1.1' In [10]: str(ip2) Out[10]: 'IPAddress: 10.2.2.2' 

Второе строковое представление, которое используется в объектах Python, отображается при использовании функции repr, а также при добавлении объектов в контейнеры типа списков:

In [11]: ip_addresses = [ip1, ip2] In [12]: ip_addresses Out[12]: [__main__.IPAddress at 0xb4e40c8c>, __main__.IPAddress at 0xb1bc46ac>] In [13]: repr(ip1) Out[13]: '' 

За это отображение отвечает метод __repr__, он тоже должен возвращать строку, но при этом принято, чтобы метод возвращал строку, скопировав которую, можно получить экземпляр класса:

In [14]: class IPAddress: . : def __init__(self, ip): . : self.ip = ip . : . : def __str__(self): . : return f"IPAddress: self.ip>" . : . : def __repr__(self): . : return f"IPAddress('self.ip>')" . : In [15]: ip1 = IPAddress('10.1.1.1') In [16]: ip2 = IPAddress('10.2.2.2') In [17]: ip_addresses = [ip1, ip2] In [18]: ip_addresses Out[18]: [IPAddress('10.1.1.1'), IPAddress('10.2.2.2')] In [19]: repr(ip1) Out[19]: "IPAddress('10.1.1.1')" 

Источник

Читайте также:  Метод system arraycopy java
Оцените статью