拥有__str__方法的目的是创建对象的字符串表示。__str__ 应该返回一个字符串。如果 的实现__str__改为打印字符串表示并且不返回任何内容,则当在字符串上下文中使用对象时TypeError将引发 a 。举个例子:
def __str__(self):
        print '%f/%f'%(self.num,self.den)
如果我们像这样显示一个分数对象:
f = Fraction(1,2)
print f
我们得到一个例外:
Traceback (most recent call last):
  File "/Users/.../Desktop/...", line 13, in <module>
    print f
TypeError: __str__ returned non-string (type NoneType)
>>> 
这是因为__str__用于获取对象的字符串表示形式,而不是打印它(按照惯例,只要返回字符串,您就可以打印)。这就是print语句/函数与方法一起使用的目的__str__。
另一方面,像这样的方法show:
def show(self):
        print(self.num,"/",self.den) #or even print(self) (for the last part of answer)
本质上等同print(f)于上述情况(除了它在操作数旁边包含空格)。show用于输出字符串表示,同时__str__获取表示。
但是,在构造字符串表示时,可能会添加show不合适/不必要的额外逻辑,因此同时使用这两种方法是有意义的。
但是,您可以使用类似showwhereprint语句不合适的方法,即:
if f.show(): pass
if print(f): pass #raise exception