Автор оригинала: Shubham Sayon.
Резюме: Ключевая цель __str__
и __repr__
это вернуть строковое представление объекта Python. Как они представлять Струнный объект дифференцирует их.
str ()
&__str () __
вернуть печатный / читаемый Строковое представление объекта, которое сосредоточено на конечном пользователе.rep ()
&__repr () __
Вернуть строковое представление объекта, которое является Допустимый объект Python , то, что вы можете перейти кEval ()
или введите в оболочку Python, не получив ошибку. Его главная цель – быть недвусмысленно Отказ
Заявление о проблеме: В чем разница между __str__
и __repr__
в Python?
Во-первых, давайте обсудим, почему это один из наиболее распространенных вопросов в Интернете. Давайте посмотрим на пример, чтобы понять причину путаницы.
Пример 1:
name = 'FINXTER' print(str(name)) print(repr(name))
Выход:
FINXTER 'FINXTER'
Теперь вы видите, почему это так запутано! 🤔 Оба они, кажется, печатают строку Finxter
Отказ Таким образом, они оба являются встроенными функциями, и оба возвращают строковое представление объекта; Единственная видимая разница в этом случае – str ()
Распечат строку без кавычек ( Finxter
), а rep ()
Распечатывает свои цитаты ( 'Finxter'
).
➤ Примечание : Если вы задаетесь вопросом, почему мы используем rep ()
и str ()
вместо __repr__
и __str__
Тогда, пожалуйста, посмотрите на записку, приведенную ниже:
Но теперь давайте посмотрим на другой пример;
Пример 2:
from datetime import datetime d = datetime.now() print(str(d)) print(repr(d))
Выход:
2020-11-04 16:38:20.048483 datetime.datetime(2020, 11, 4, 16, 38, 20, 48483)
Во втором примере мы можем четко визуализировать разницу между rep ()
и str ()
Отказ
Давайте посмотрим на то, о чем говорит официальная документация о объект .__ riv __ (
self )
и объект .__ ул __ (
self )
:
объект .__ rep __ (
self )
: Вызывается rep ()
Встроенная функция для вычисления « официальный » строковое представление объекта.
объект .__ ул __ (я)
: Вызывается str ()
Встроенная функция и оператор печати для вычисления строкового представления « неформально » объекта.
Другими словами, мы можем сказать, что:
❖ Цель __repr__ – быть однозначным
__repr __ ()
Функция Возвращает представление объекта любого допустимого выражения Python, например кортеж , Словарь , строка и т. Д. Это значит, когда rep ()
Функция вызывается на объекте, это вернет сам объект и, следовательно, можно оценить с помощью Eval ()
функция для воссоздания самого объекта из-за его однозначной природы. Таким образом, («25»)
Отказ
Давайте посмотрим на быстрый пример, где мы можем использовать rep ()
на выражение и оценить его с помощью Eval ()
функция.
Примечание: Вы не можете использовать Eval ()
Функция на str ()
который четко изображен в примере ниже.
Пример:
text1 = 'a string' text2 = eval(repr(text1)) if text1 == text2: print("eval() Works!") text3 = eval(str(text1)) if text1 == text3: print("eval() Works!")
Выход:
eval() Works! Traceback (most recent call last): File "main.py", line 5, intext3 = eval(str(text1)) File " ", line 1 a string ^ SyntaxError: unexpected EOF while parsing
❖ Цель __str__ – быть читаемой
Цель __str__
не однозначно, скорее его цель состоит в том, чтобы предоставить представление, что пользователь больше читаемый пользователю. Таким образом, str (25) == ул. ("25")
Отказ
Давайте посмотрим на очень простой пример, который демонстрирует однозначную природу rep ()
и аспект читаемости str ()
Отказ
if str(25)==str("25"): print("Goal of __str__ : Readability") if repr(25)!=repr("25"): print("Goal of __repr__ : Unamgiuity")
Выход:
Goal of __str__ : Readability Goal of __repr__ : Unamgiuity
✨ Проще говоря, __repr__
для разработчиков пока __str__
Для клиентов!
Точки запомнить
❖ Для контейнеров __str__ использует содержащиеся объекты __repr__
Чтобы упростить вещи, давайте возьмем помощь пример:
rank = {'Rick': 1} language = ['Python', 'Java'] error = (404, 'status_code') for item in (rank, language, error): print(f"{str(type(item)):}") print(f"repr() representation: {repr(item):}") print(f"str() representation: {str(item)}") print("\n")
Выход:
repr() representation: {'Rick': 1} str() representation: {'Rick': 1} repr() representation: ['Python', 'Java'] str() representation: ['Python', 'Java'] repr() representation: (404, 'status_code') str() representation: (404, 'status_code')
В приведенном выше примере ясно, что даже когда мы используем str ()
На объекте контейнера функция str () вызывает их __repr () __
метод; Следовательно, мы получаем сам объект как вывод, и нет разницы между ул.
и rep ()
При использовании с объектами. Это оправдывает, что для контейнеров __str__
использует содержащиеся объекты « __repr__
Отказ
❖ Реализация по умолчанию __str__ и __repr__ бесполезно
Реализация по умолчанию __str__
и __repr__
бесполезен и если вы не гарантируете конкретно определить и использовать их, большинство классов не имеют полезных результатов. Давайте сделаем все возможное с помощью другого примера:
class Finxter(object): pass print(str(Finxter())) print(repr(Finxter()))
Выход:
<__main__.Finxter object at 0x7f85641d15e0> <__main__.Finxter object at 0x7f85641d15e0>
Как видно выше, нет разницы между методом, ни в одной информации за пределами классов ID
Отказ
Примечание: Объект будет вести себя как будто __str __ = __ raper__
Если __repr__
определяется, а __str__
не является.
Теперь давайте попробуем переопределите __str__
и __repr__
Методы для визуализации их поведения на Пользовательские объекты. Пожалуйста, следуйте примеру, указанному ниже.
Пример:
class Finxter(object): def __str__(object): return str("Freelancing") def __repr__(object): return repr("Freelancing") print(str(Finxter())) print(repr(Finxter())) print(eval(repr(Finxter())))
Выход:
Freelancing 'Freelancing' Freelancing
Из приведенного выше примера понятно, что __repr __ ()
Кабина легко переопределить так, чтобы rep ()
работает по-другому.
Примечание: Если вы переопределите __repr__
это также будет использоваться для
__str__
, но наоборот невозможен. Давайте посмотрим на это в приведенном ниже примере.
Пример A: Переопределение __repr__
также переопределяет __str__
class Finxter(object): def __repr__(object): return repr("Freelancing") print(str(Finxter())) print(repr(Finxter()))
Выход:
'Freelancing' 'Freelancing'
Пример B: Переопределение __str__
не влияет на __repr__
class Finxter(object): def __str__(object): return str("Freelancing") print(str(Finxter())) print(repr(Finxter()))
Выход:
Freelancing <__main__.Finxter object at 0x7f3b284ef5e0>
Заключение
Давайте суммируем ключевую разницу между __repr__
и __str__
ул. | Repra () |
Это неофициальное строковое представление и используется для чтения объекта. | Это официальное строковое представление и используется для создания объекта однозначно. |
Генерирует вывод, предназначенный для конечных пользователей. | Генерирует выход, который полезен для разработчиков. |
Пожалуйста, подпишитесь и оставайтесь настроенными для более интересных статей!
Куда пойти отсюда?
Достаточно теории, давайте познакомимся!
Чтобы стать успешным в кодировке, вам нужно выйти туда и решать реальные проблемы для реальных людей. Вот как вы можете легко стать шестифункциональным тренером. И вот как вы польские навыки, которые вам действительно нужны на практике. В конце концов, что такое использование теории обучения, что никто никогда не нуждается?
Практические проекты – это то, как вы обостряете вашу пилу в кодировке!
Вы хотите стать мастером кода, сосредоточившись на практических кодовых проектах, которые фактически зарабатывают вам деньги и решают проблемы для людей?
Затем станьте питоном независимым разработчиком! Это лучший способ приближения к задаче улучшения ваших навыков Python – даже если вы являетесь полным новичком.
Присоединяйтесь к моему бесплатным вебинаре «Как создать свой навык высокого дохода Python» и посмотреть, как я вырос на моем кодированном бизнесе в Интернете и как вы можете, слишком от комфорта вашего собственного дома.
Присоединяйтесь к свободному вебинару сейчас!
Я профессиональный Python Blogger и Content Creator. Я опубликовал многочисленные статьи и создал курсы в течение определенного периода времени. В настоящее время я работаю полный рабочий день, и у меня есть опыт в областях, таких как Python, AWS, DevOps и Networking.
Вы можете связаться со мной @:
Оригинал: “https://blog.finxter.com/python-__str__-vs-__repr__/”