2013-08-29 4 views
0

Почему первый код печатается, а второй - нет? Есть что-то особенное в возвращении?python return and print через класс

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) 
+0

Вам нужно вернуться во втором. – badc0re

+0

@ badc0re: Ах, вот и все! Я сидел здесь, косясь, пытаясь понять, как эти два класса отличаются в первую очередь. | -} –

ответ

3

При вызове print() на объекте интерпретатор вызывает __str__() метод объекта, чтобы получить его стрин g.

print(f) получает «расширенный» до print(f.__str__()).

Функция печати здесь:

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

вызывается, печатает и возвращает None, поэтому наружная печать генерирует TypeError:

Так что, да. Вам нужно вернуть строку в методе __str__().

+0

Спасибо, что помогло – vinita

+0

Добро пожаловать =) –

2

Вам необходимо исправить:

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

To:

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

Он знает, что работает - это единственная разница между двумя тестами. Он спрашивает, почему - какая разница. – neil

+0

Ну, похоже, он не спрашивает, в чем разница, если он ошибался, он мог сделать комментарий. Я прав? – badc0re

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

сообщает, что __str__ возвращает нестроку.
Это becouse ул должна возвращать строку и в версии:

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

Вы печатаете результат и не возвращаются None.
Вы должны вернуть строку, как и в версии 1