Автор оригинала: 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__/”