Я пишу класс на Python, и я пишу функцию __str__(), чтобы мои операторы печати могли печатать строковые представления экземпляров этого класса. Есть ли причина делать что-то вроде этого напрямую:
myObj = Foo(params)
doSomething(myObj.__str__())
Похоже, что, поскольку есть другие способы сделать это, было бы плохой идеей (или, по крайней мере, неподходящим стилем) напрямую вызывать __str__(). Тем не менее, я не могу найти веб-сайт, на котором бы конкретно запрещалось.






Если вам нужно настраиваемое строковое представление вашего класса, внедрите __str__ в определение вашего класса, а затем вы можете вызвать его с помощью str(myObj), который вызовет ваш метод. Вызов __str__ будет таким же, но не таким чистым, как я бы сказал.
myObj.__str__()
такой же как
str(myObj)
если только у кого-то не возникнет плохая идея скрыть встроенный str, переназначив его имя:
str = lambda x: None
в этом случае будет работать только первый подход. Но в общем случае лучше избегать прямого вызова этих методов.
да. Плохая идея. Опытные программисты Python не допускают такой ошибки :) вы можете расширить этот пример на list и dict ...
* любая ошибка;)
В общем, dunder-методы определяют, как объект ведет себя в определенном контексте. Они не предназначены для прямого использования. (Основное исключение - когда вы переопределяете dunder-метод, унаследованный от родительского класса.)
В случае __str__ есть три задокументированных использования; он используется встроенными функциями str, format и print, так что (грубо говоря)
str(myObj) == myObj.__str__()format("{}", myObj) == format("{}", myObj.__str__())print(myObj) == print(myObj.__str__()).Ключевым моментом здесь является то, что __str__ позволяет коду, встроенному в не Python, работать с этими функциями; метод __str__ обеспечивает общий интерфейс, который могут использовать все трое.
Это плохая идея, но это очень распространенная вещь, поскольку
str- это наиболее распространенное имя для строковой переменной, которое очень трудно обнаружить ошибку.