Должен ли я когда-либо напрямую вызывать объект .__ str __ ()?

Я пишу класс на Python, и я пишу функцию __str__(), чтобы мои операторы печати могли печатать строковые представления экземпляров этого класса. Есть ли причина делать что-то вроде этого напрямую:

myObj = Foo(params)
doSomething(myObj.__str__())

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

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
5
0
178
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Если вам нужно настраиваемое строковое представление вашего класса, внедрите __str__ в определение вашего класса, а затем вы можете вызвать его с помощью str(myObj), который вызовет ваш метод. Вызов __str__ будет таким же, но не таким чистым, как я бы сказал.

myObj.__str__()

такой же как

str(myObj)

если только у кого-то не возникнет плохая идея скрыть встроенный str, переназначив его имя:

str = lambda x: None

в этом случае будет работать только первый подход. Но в общем случае лучше избегать прямого вызова этих методов.

Это плохая идея, но это очень распространенная вещь, поскольку str - это наиболее распространенное имя для строковой переменной, которое очень трудно обнаружить ошибку.

galfisher 06.04.2018 17:59

да. Плохая идея. Опытные программисты Python не допускают такой ошибки :) вы можете расширить этот пример на list и dict ...

Jean-François Fabre 06.04.2018 18:00

* любая ошибка;)

galfisher 06.04.2018 18:00
Ответ принят как подходящий

В общем, dunder-методы определяют, как объект ведет себя в определенном контексте. Они не предназначены для прямого использования. (Основное исключение - когда вы переопределяете dunder-метод, унаследованный от родительского класса.)

В случае __str__ есть три задокументированных использования; он используется встроенными функциями str, format и print, так что (грубо говоря)

  1. str(myObj) == myObj.__str__()
  2. format("{}", myObj) == format("{}", myObj.__str__())
  3. print(myObj) == print(myObj.__str__()).

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

Другие вопросы по теме