2014-04-22 66 views
0

我有以下示例代碼,但是,從__add__輸出犯規看起來一樣的__str__輸出。我需要所有輸出看起來完全像__str__輸出格式。的Python __str__和__add__輸出

class Foo: 
    def __init__(self,x,y=0): 
     self.x = x 
     self.y = y 
    def __str__(self): 
     return str(str(self.x/self.y) + "%") 
    def __add__(self,other): 
     if self.y > 50: 
      return str((self.x + other.x)/(self.y+other.y)) + "%" 
     else: 
      return str((self.x + other.x)/(self.y+other.y)) + "%" 

__str__輸出看起來就像這樣:

>>> a = Foo(1,3) 
>>> print(a) 
>>> 0.33333% 

__add__輸出:

>>> Foo(1,3) + Foo(0,0) 
>>> '0.33333%' 

爲什麼當我用__add____sub__是否有單引號,而不是當我使用__str__

+1

不同的是,首先你'print'的結果,第二次你REPL只是顯示的結果。 – Hyperboreus

+1

當你打印一個字符串時,它不打印引號。 – roippi

+4

如果'__add__'返回了'Foo'的實例,這不是明智嗎?這樣你可以做'Foo(1,2)+ Foo(3,4)+ Foo(5,6)'。 – Hyperboreus

回答

1

如上所述:你REPL顯示的報價,當最後操作的結果是一個字符串。當您打印一個字符串時,您的REPL不顯示引號(並且壓制了結果None)。

由於此行爲的小例子,你可以試試這個:

Python 3.2.4 (default, May 10 2013, 08:57:38) 
[GCC 4.7.3] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> a = 'Hello' 
>>> a 
'Hello' 
>>> print(a) 
Hello 

兩次相同的字符串,一旦與顯示,一次不帶引號。


也可以考慮在你的__add__方法返回美孚的實際例子:

class Foo: 
    def __init__(self, x, y=0): 
     self.x = x 
     self.y = y 
    def __str__(self): 
     return str(self.x/self.y) + "%" 
    def __add__(self, other): 
     return Foo(self.x + other.x, self.y + other.y) 

這樣你就可以做如Foo(1, 2) + Foo(3, 4) + Foo(5, 6)你不能用你的代碼。

1

這與您的自定義__add__甚至__str__方法無關 - 這是交互式解釋器的一個功能。

通常,在一個Python腳本,你需要使用類似print顯示輸出。

然而,在互動,解釋有一個方便的快捷方式:您可以輸入任何expression,它會評估它,並打印其結果表示。這通常被稱爲read–eval–print loop (REPL)

注意上面的區別:它打印表示的結果,而不是結果本身。這通常是(對於原始類型和通用對象)另一個將重新創建相同對象的Python表達式。

因此,在一個字符串的情況下a = 'foo'字符串爲foo,但其表示是'foo'

>>> a = 'foo' 
>>> print a 
foo 
>>> a 
'foo' 

獲取對象的代表性,Python會自動調用obj.__repr__(還有一個速記repr(obj),你可以使用)。