Python __str__ 和 __add__ 输出

0 投票
2 回答
1502 浏览
提问于 2025-04-18 03:47

我有一段示例代码,但是从 __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 个回答

1

这和你自己定义的 __add____str__ 方法没有关系,这其实是交互式解释器的一个功能。

通常在一个 Python 脚本里,你需要用 print 来显示输出。

但是在交互式解释器中,有一个很方便的快捷方式:你可以输入任何一个 表达式,它会计算这个表达式,并打印出结果的 表示形式。这个过程通常被称为 读-评估-打印循环(REPL)

注意上面的区别:它打印的是结果的 表示形式,而不是结果本身。对于基本类型和常见对象来说,这通常是另一个 Python 表达式,可以用来重新创建相同的对象。

举个例子,对于字符串 a = 'foo',字符串的内容是 foo,但它的表示形式是 'foo'

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

要获取一个对象的表示形式,Python 会调用 obj.__repr__(你也可以使用一个简写的方式 repr(obj))。

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),而你的代码是做不到这一点的。

撰写回答