我有以下示例代码,但__add__
的输出与__str__
输出看起来不一样。我需要所有输出看起来与__str__
输出格式完全相同。
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__
时?
答案 0 :(得分: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__
方法中返回实际的Foo实例:
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 :(得分: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)
)。