Python def str self

Функции __str __() и __repr __() в Python

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

__str __() в Python

Этот метод возвращает строковое представление объекта. Этот метод вызывается, когда для объекта вызывается функция print() или str().

Этот метод должен возвращать объект String. Если мы не реализуем функцию __str __() для класса, тогда используется встроенная реализация объекта, которая фактически вызывает функцию __repr __().

__repr __() в Python

Функция __repr __() возвращает представление объекта. Это может быть любое допустимое выражение в Python, такое как кортеж, словарь, строка и т.д.

Этот метод вызывается, когда для объекта используется функция repr(), в этом случае функция __repr __() должна возвращать String, иначе будет выдана ошибка.

Пример __str__ и __repr__ в Python

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

class Person: name = "" age = 0 def __init__(self, personName, personAge): self.name = personName self.age = personAge p = Person('Pankaj', 34) print(p.__str__()) print(p.__repr__())

Как видите, реализация по умолчанию бесполезна. Давайте продолжим и реализуем оба этих метода:

class Person: name = "" age = 0 def __init__(self, personName, personAge): self.name = personName self.age = personAge def __repr__(self): return def __str__(self): return 'Person(name='+self.name+', age='+str(self.age)+ ')'

Обратите внимание, что мы возвращаем dict для функции __repr__. Посмотрим, что произойдет, если мы воспользуемся этими методами.

p = Person('Pankaj', 34) # __str__() example print(p) print(p.__str__()) s = str(p) print(s) # __repr__() example print(p.__repr__()) print(type(p.__repr__())) print(repr(p))
Person(name=Pankaj, age=34) Person(name=Pankaj, age=34) Person(name=Pankaj, age=34)  File "/Users/pankaj/Documents/PycharmProjects/BasicPython/basic_examples/str_repr_functions.py", line 29, in print(repr(p)) TypeError: __repr__ returned non-string (type dict)

Обратите внимание, что функция repr() выдает ошибку TypeError, поскольку наша реализация __repr__ возвращает dict, а не строку.

Изменим реализацию функции __repr__ следующим образом:

Теперь он возвращает String, и новый вывод для вызовов представления объекта будет:

Ранее мы упоминали, что если мы не реализуем функцию __str__, то вызывается функция __repr__. Просто прокомментируйте реализацию функции __str__ из класса Person, и print (p) напечатает .

Разница между функциями __str__ и __repr__

  1. __str__ должен возвращать строковый объект, тогда как __repr__ может возвращать любое выражение в Python.
  2. Если реализация __str__ отсутствует, то функция __repr__ используется как резерв. Если реализация функции __repr__ отсутствует, отката нет.
  3. Если функция __repr__ возвращает строковое представление объекта, мы можем пропустить реализацию функции __str__.

Заключение

Обе функции __str__ и __repr__ очень похожи. Мы можем получить представление объекта в формате String, а также в других конкретных форматах, таких как tuple и dict, чтобы получить информацию об объекте.

Источник

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

Python 3 логотип

Перегрузка операторов — один из способов реализации полиморфизма, когда мы можем задать свою реализацию какого-либо метода в своём классе.

Например, у нас есть два класса:

 В данном примере класс B наследует класс A, но переопределяет метод go, поэтому он имеет мало общего с аналогичным методом класса A.

Однако в python имеются методы, которые, как правило, не вызываются напрямую, а вызываются встроенными функциями или операторами.

Например, метод __init__ перегружает конструктор класса. Конструктор — создание экземпляра класса.

 

__new__(cls[, . ]) — управляет созданием экземпляра. В качестве обязательного аргумента принимает класс (не путать с экземпляром). Должен возвращать экземпляр класса для его последующей его передачи методу __init__.

__init__(self[, . ]) - как уже было сказано выше, конструктор.

__del__(self) - вызывается при удалении объекта сборщиком мусора.

__repr__(self) - вызывается встроенной функцией repr; возвращает "сырые" данные, использующиеся для внутреннего представления в python.

__str__(self) - вызывается функциями str, print и format. Возвращает строковое представление объекта.

__bytes__(self) - вызывается функцией bytes при преобразовании к байтам.

__format__(self, format_spec) - используется функцией format (а также методом format у строк).

__le__(self, other) - x ≤ y вызывает x.__le__(y).

__eq__(self, other) - x == y вызывает x.__eq__(y).

__ne__(self, other) - x != y вызывает x.__ne__(y)

__gt__(self, other) - x > y вызывает x.__gt__(y).

__ge__(self, other) - x ≥ y вызывает x.__ge__(y).

__hash__(self) - получение хэш-суммы объекта, например, для добавления в словарь.

__bool__(self) - вызывается при проверке истинности. Если этот метод не определён, вызывается метод __len__ (объекты, имеющие ненулевую длину, считаются истинными).

__getattr__(self, name) - вызывается, когда атрибут экземпляра класса не найден в обычных местах (например, у экземпляра нет метода с таким названием).

__setattr__(self, name, value) - назначение атрибута.

__delattr__(self, name) - удаление атрибута (del obj.name).

__call__(self[, args. ]) - вызов экземпляра класса как функции.

__len__(self) - длина объекта.

__getitem__(self, key) - доступ по индексу (или ключу).

__setitem__(self, key, value) - назначение элемента по индексу.

__delitem__(self, key) - удаление элемента по индексу.

__iter__(self) - возвращает итератор для контейнера.

__reversed__(self) - итератор из элементов, следующих в обратном порядке.

__contains__(self, item) - проверка на принадлежность элемента контейнеру (item in self).

Перегрузка арифметических операторов

__add__(self, other) - сложение. x + y вызывает x.__add__(y).

__sub__(self, other) - вычитание (x - y).

__mul__(self, other) - умножение (x * y).

__truediv__(self, other) - деление (x / y).

__floordiv__(self, other) - целочисленное деление (x // y).

__mod__(self, other) - остаток от деления (x % y).

__divmod__(self, other) - частное и остаток (divmod(x, y)).

__pow__(self, other[, modulo]) - возведение в степень (x ** y, pow(x, y[, modulo])).

__lshift__(self, other) - битовый сдвиг влево (x

__rshift__(self, other) - битовый сдвиг вправо (x >> y).

__and__(self, other) - битовое И (x & y).

__xor__(self, other) - битовое ИСКЛЮЧАЮЩЕЕ ИЛИ (x ^ y).

__or__(self, other) - битовое ИЛИ (x | y).

__rtruediv__(self, other),

__rfloordiv__(self, other),

__rdivmod__(self, other),

__rlshift__(self, other),

__rrshift__(self, other),

__ror__(self, other) - делают то же самое, что и арифметические операторы, перечисленные выше, но для аргументов, находящихся справа, и только в случае, если для левого операнда не определён соответствующий метод.

Например, операция x + y будет сначала пытаться вызвать x.__add__(y), и только в том случае, если это не получилось, будет пытаться вызвать y.__radd__(x). Аналогично для остальных методов.

__itruediv__(self, other) - /=.

__ifloordiv__(self, other) - //=.

__ipow__(self, other[, modulo]) - **=.

__ilshift__(self, other) -

__irshift__(self, other) - >>=.

__neg__(self) - унарный -.

__pos__(self) - унарный +.

__abs__(self) - модуль (abs()).

__invert__(self) - инверсия (~).

__complex__(self) - приведение к complex.

__int__(self) - приведение к int.

__float__(self) - приведение к float.

__round__(self[, n]) - округление.

__enter__(self), __exit__(self, exc_type, exc_value, traceback) - реализация менеджеров контекста.

Рассмотрим некоторые из этих методов на примере двухмерного вектора, для которого переопределим некоторые методы:

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

Для вставки кода на Python в комментарий заключайте его в теги

  • Книги о Python
  • GUI (графический интерфейс пользователя)
  • Курсы Python
  • Модули
  • Новости мира Python
  • NumPy
  • Обработка данных
  • Основы программирования
  • Примеры программ
  • Типы данных в Python
  • Видео
  • Python для Web
  • Работа для Python-программистов

Источник

Методы __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')" 

Источник

Читайте также:  Save file csv java
Оцените статью