刚刚遇到一个示例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} }?
答案 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.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
中。
答案 2 :(得分:3)
__str__
是一种神奇的方法,每次将对象视为字符串时都会调用它,例如str(fraction_instance)