我应该直接调用object .__ str __()吗?

时间:2018-04-06 15:54:50

标签: python oop

我正在用Python编写一个类,我正在编写__str__()函数,因此我的print语句可以打印该类实例的字符串表示。是否有理由直接做这样的事情:

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

感觉就像有其他更简洁的方法来做到这一点,直接调用__str__()会是一个坏主意(或者至少不是正确的风格)。也就是说,我无法找到一个专门拒绝的网站。

4 个答案:

答案 0 :(得分:3)

通常,dunder方法定义对象在特定上下文中的行为方式。它们不打算直接使用。 (主要的例外是当你重写从父类继承的dunder方法时。)

如果是__str__,则有three documented uses;它由内置函数strformatprint使用,以便(粗略地说)

  1. str(myObj) == myObj.__str__()
  2. format("{}", myObj) == format("{}", myObj.__str__())
  3. print(myObj) == print(myObj.__str__())
  4. 这里的关键是__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__(),则更容易访问它的属性本身