-1

为什么第一个代码打印而第二个不打印?退货有什么特别之处吗?

In [339]: class fraction:
    def __init__(self,top,bottom):
        self.num=top
        self.den=bottom
    def __str__(self):
        return str(self.num)+"/"+str(self.den)
   .....:

In [340]: f=fraction(3,8)

In [341]: print(f)
3/8

In [342]: class fraction:
    def __init__(self,top,bottom):
        self.num=top
        self.den=bottom
    def __str__(self):
        print str(self.num)+"/"+str(self.den)
   .....:

In [343]: f=fraction(3,8)

In [344]: print(f)
3/8

TypeError                                 Traceback (most recent call last)
<ipython-input-344-d478acf29e40> in <module>()
----> 1 print(f)

TypeError: __str__ returned non-string (type NoneType)
4

3 回答 3

3

当你调用print()一个对象时,解释器调用对象的__str__()方法来获取它的字符串表示。

print(f)被“扩展”为print( f.__str__() ).

这里的打印功能:

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

被调用,打印并返回None,因此外部打印生成一个TypeError

是的。您需要在方法中返回一个字符串__str__()

于 2013-08-29T12:28:59.030 回答
2

您需要修复:

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

至:

def __str__(self):
        return str(self.num)+"/"+str(self.den)
于 2013-08-29T12:19:14.467 回答
1
TypeError: __str__ returned non-string (type NoneType)

告诉你 __str__ 返回非字符串。
那是因为 str 必须返回一个字符串和版本:

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

您正在打印结果并返回None
您必须像在版本 1 中一样返回一个字符串

于 2013-08-29T12:34:27.170 回答