__str __(self)和show(self)之间的区别

时间:2013-10-19 08:23:47

标签: python

刚刚遇到一个示例Fraction类,我不太清楚这两种方法之间的区别是什么。实施__str__后,show不会变得更加重要吗?

def __str__(self):
    return str(self.num)+"/"+str(self.den)

def show(self):
    print(self.num,"/",self.den)

我意识到__str__是一个 magic 方法,它的实现负责处理需要字符串版本的任何上下文。只是看不出show(self)方法的要点?


修改

是否显示大多数类需要的通用方法?
我的问题是,如果我有一个分数x,那么我需要做的就是print(x)我会看到1\2或实例所持有的东西 - 那么为什么还要为实现一个额外的方法而烦恼{{1} }?

3 个答案:

答案 0 :(得分:7)

拥有__str__方法的目的是创建对象的字符串表示。 __str__ 应该返回一个字符串。如果__str__的实现改为打印字符串表示并且什么都不返回,则当在字符串上下文中使用该对象时,将引发TypeError。举个例子:

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中可能会添加额外的逻辑,这在构造字符串表示时是不合适/必要的,因此有两种方法都有意义。

但是,您可以使用show之类的方法,其中print语句不合适,例如:

if f.show(): pass
if print(f): pass #raise exception

答案 1 :(得分:4)

__str__方法非常谨慎,以确保所有内容都是str,因此它返回str

show方法依靠print将self.numself.den隐式转换为str。它将结果显示为副作用,并返回None

print将在每个参数之间插入一个空格。

>>> str(3)+"/"+str(5)
'3/5'
>>> print(3,"/",5)
3 / 5

如果您不关心额外的空格,那么实际上没有理由不使用

def show(self):
    print(self)

也许作者认为不这样做更清楚。

当您尝试创建子类时,以这种方式解耦show__str__也可能会令人惊讶。如果子类重写__str__,您可能希望更改也反映在show中。

答案 2 :(得分:3)

__str__是一种神奇的方法,每次将对象视为字符串时都会调用它,例如str(fraction_instance)