刚刚遇到了一个示例分数类,不太确定这两种方法之间的区别是什么。一旦__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.num
和 self.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)