Python __str__ 和 __add__ 输出
我有一段示例代码,但是从 __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)
,而你的代码是做不到这一点的。