我正在用Python编写一个类,我正在编写__str__()
函数,因此我的print语句可以打印该类实例的字符串表示。是否有理由直接做这样的事情:
myObj = Foo(params)
doSomething(myObj.__str__())
感觉就像有其他更简洁的方法来做到这一点,直接调用__str__()
会是一个坏主意(或者至少不是正确的风格)。也就是说,我无法找到一个专门拒绝的网站。
答案 0 :(得分:3)
通常,dunder方法定义对象在特定上下文中的行为方式。它们不打算直接使用。 (主要的例外是当你重写从父类继承的dunder方法时。)
如果是__str__
,则有three documented uses;它由内置函数str
,format
和print
使用,以便(粗略地说)
str(myObj) == myObj.__str__()
format("{}", myObj) == format("{}", myObj.__str__())
print(myObj) == print(myObj.__str__())
。这里的关键是__str__
允许Python内置不的代码使用这些函数; __str__
方法提供了三个可以使用的通用接口。
答案 1 :(得分:2)
myObj.__str__()
与
相同str(myObj)
除非有人通过重新分配名称来隐藏str
内置错误:
str = lambda x: None
在这种情况下,只有第一种方法才有效。但在一般情况下,最好避免直接调用这些dunder方法。
答案 2 :(得分:0)
如果您想要自定义字符串表示类,请在类定义中实现__str__
,然后您可以使用str(myObj)
调用它来调用您的方法。拨打__str__
会是一样的,但我并不干净。
答案 3 :(得分:0)
这是在打印报表和日志中表示对象的正确方法,但我不知道你为什么会这样做
myObj = Foo(params)
doSomething(myObj.__str__())
在
myObj = Foo(params)
doSomething(myObj)
将对象作为字符串传递给函数似乎是不必要的,因为如果您传递了对象并且所述函数也可以调用myObj.__str__()
,则更容易访问它的属性本身强>