__str__(自我)和表演(自我)之间的区别



刚刚遇到了一个示例分数类,不太确定这两种方法之间的区别是什么。一旦__str__实施,show不会变得多余吗?

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

我意识到__str__是一种神奇的方法,它的实现可以处理任何需要类的字符串版本的上下文。只是看不出show(self)方法的意义?


编辑

show 是大多数类所需的通用方法吗?
我的问题是,如果我有一个分数 x,那么我需要做的就是print(x),我会看到12或实例持有的任何内容 - 那么为什么要费心实现额外的方法show

具有__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

__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中。

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

最新更新