Python __str__和__add__输出

时间:2014-04-22 17:39:43

标签: python

我有以下示例代码,但__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__时?

2 个答案:

答案 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))。