В чем цель __str__ и __repr__?

Я действительно не понимаю, где __str__ и __repr__ используются в Python. Я имею в виду, я получаю, что __str__ возвращает строковое представление объекта. Но зачем мне это нужно? В каком сценарии использования? Кроме того, я читал об использовании __repr__

Но я не понимаю, где бы я их использовал?

5 Solutions collect form web for “В чем цель __str__ и __repr__?”

__repr__

Вызывается встроенной функцией repr() и преобразованиями строк (обратные кавычки) для вычисления «официального» строкового представления объекта. Если это вообще возможно, это должно выглядеть как действительное выражение Python, которое может быть использовано для воссоздания объекта с тем же значением (с учетом соответствующей среды).

__str__

Вызывается встроенной функцией str() и оператором печати для вычисления «неформального» строкового представления объекта.

Используйте __str__ если у вас есть class, и вам понадобится информативный / неофициальный вывод, всякий раз, когда вы используете этот объект как часть строки. Например, вы можете определить методы __str__ для моделей Django, которые затем отображаются в интерфейсе администрирования Django. Вместо того, что-то вроде вы получите как имя и фамилию человека, имя и дату события и т. Д.


__repr__ и __str__ аналогичны, на самом деле иногда равны (пример из classа sets.py в sets.py из стандартной библиотеки):

 def __repr__(self): """Return string representation of a set. This looks like 'Set([])'. """ return self._repr() # __str__ is the same as __repr__ __str__ = __repr__ 

Одно место, где вы их используете, – это интерактивный сеанс. Если вы печатаете объект, его метод __str__ будет вызван, тогда как если вы просто используете объект сам по себе, то __repr__ его __repr__ :

 >>> from decimal import Decimal >>> a = Decimal(1.25) >>> print(a) 1.25 < ---- this is from __str__ >>> a Decimal('1.25') < ---- this is from __repr__ 

__str__ призван быть максимально понятным для человека, тогда как __repr__ должен быть тем, что можно было бы использовать для воссоздания объекта, хотя часто это не так точно, как оно было создано, как в этом случае.

Также не редкость для __str__ и __repr__ возвращать одинаковое значение (конечно, для встроенных типов).

Кузнечик, когда сомневаюсь, идет на гору и читает Древние тексты . В них вы обнаружите, что __repr __ () должен:

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

Построение и предыдущие ответы и еще несколько примеров. При правильном использовании разница между str и repr понятна. Короче говоря, repr должен возвращать строку, которая может быть скопирована в скопированном виде, чтобы восстановить точное состояние объекта, тогда как str полезно для logging и observing результатов отладки. Вот несколько примеров, чтобы увидеть различные результаты для некоторых известных библиотек.

Datetime

 print repr(datetime.now()) #datetime.datetime(2017, 12, 12, 18, 49, 27, 134411) print str(datetime.now()) #2017-12-12 18:49:27.134452 

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

 x = datetime.datetime(2017, 12, 12, 18, 49, 27, 134411) 

Numpy

 print repr(np.array([1,2,3,4,5])) #array([1, 2, 3, 4, 5]) print str(np.array([1,2,3,4,5])) #[1 2 3 4 5] 

в Numpy повтор снова расходуется.

Пользовательский пример Vector3

 class Vector3(object): def __init__(self, args): self.x = args[0] self.y = args[1] self.z = args[2] def __repr__(self): return "x: {0}, y: {1}, z: {2}".format(self.x, self.y, self.z) def __str__(self): return "Vector3([{0},{1},{2}])".format(self.x, self.y, self.z) 

В этом примере repr снова возвращает строку, которая может быть непосредственно использована / выполнена, тогда как str более полезна в качестве отладочного вывода.

 v = Vector3([1,2,3]) print repr(v) #Vector3([1,2,3]) print str(v) #Vector(x:1, y:2, z:3) 

Одна вещь, о которой нужно помнить, если str не определена, а repr , str будет автоматически вызывать repr . Таким образом, всегда хорошо, по крайней мере, определить

str будет неофициальным и читаемым форматом, тогда как repr даст официальное представление объекта.

 class Complex: # Constructor def __init__(self, real, imag): self.real = real self.imag = imag # "official" string representation of an object def __repr__(self): return 'Rational(%s, %s)' % (self.real, self.imag) # "informal" string representation of an object (readable) def __str__(self): return '%s + i%s' % (self.real, self.imag) t = Complex(10, 20) print (t) # this is usual way we print the object print (str(t)) # this is str representation of object print (repr(t)) # this is repr representation of object Answers : Rational(10, 20) # usual representation 10 + i20 # str representation Rational(10, 20) # repr representation 
  • Почему аргументы, не относящиеся к умолчанию, соответствуют аргументам по умолчанию?
  • Почему функция может изменять некоторые аргументы, воспринимаемые вызывающим, но не другие?
  • Как я могу сделать один файл python другим?
  • Что означает% s в строке формата python?
  • Может ли Python распечатать определение функции?
  • Для чего используется функция id ()?
  • Как определить, является ли переменная Python функцией?
  • тип намека в classе
  • Найти путь к текущему файлу
  • Вызов функции модуля с использованием его имени (строки)
  • Каково формальное различие между «печатью» и «возвратом»?
  • Interesting Posts

    Как вы проверяете текущее дуплексное значение сетевой карты, настроенной на автоматическое согласование в Windows?

    TraceRoute и Ping в C #

    Как сохранить строки в строке в Bash?

    Как узнать настройки DHCP, предлагаемые сервером?

    Windows 10 запускает меню, как переустановить ShellExperienceHost, Cortana?

    Как обрезать навсегда в Acrobat?

    Batch Извлечение пути и имя файла из переменной

    Использовать композицию над наследованием

    Многоязычный словарь в c #?

    Линия SVG с gradleиентным штрихом не будет отображаться прямо

    Как предотвратить Windows Explorer от медленного чтения содержимого файла для создания метаданных?

    Экспорт страниц PDF в серию изображений в Java

    Windows 7: переместить системный раздел, необходимо обновить загрузочный раздел

    Sudo в Windows 10 Подсистема Linux не может разрешить локальное имя компьютера

    Как запустить приложение WinForm сведено к минимуму?

    Давайте будем гением компьютера.