为什么print("string", object)和print(object)会得出不同的结果?

5

我定义了这个类:

class Point():
    def __init__(self,x,y):
        self.x = x
        self.y = y
    def __str__(self):
        return "Point x: {0}, Point y: {1}".format(self.x, self.y)

这两个案例print("Point",p1)print(p1)之间有什么区别:

p1 = Point(1,2)
print("Point",p1)
print(p1)

>>('Point', <__main__.Point instance at 0x00D96F80>)
>>Point x: 1, Point y: 2
2个回答

12

原来的代码打印了一个包含 "Point"p1 的元组;在这种情况下,将使用 __repr__() 生成输出字符串,而不是使用 __str__()


1
如果使用Python 3,那么情况就会有所不同。或者如果使用了“print_function” future .. 请参见https://dev59.com/H2025IYBdhLWcg3wKCf- - user166390
当我们有__str__()时,为什么打印p1会有差异? - user1050619
6
因为序列不会打印其元素的字符串值,而是打印它们的表示形式。 - Ignacio Vazquez-Abrams

6
如果您使用的是Python2.x版本,那么当您认为您在像调用函数一样调用print时,实际上您正在使用print关键字打印一个元组...
print(1,2,3)
print (1,2,3)

在Python3中,您需要像调用函数一样执行它:print(1,2,3)
所以在您的情况下,在Python2.x中,您正在打印值的元组。元组对象将被转换为字符串,并且元组中的每个值都将被打印出来。当您像这样打印它们:print "Point",p1时,每个项目都将被转换为字符串并打印出来。
print str(p1)
# Point x: 1, Point y: 2

print repr(p1)
# <__main__.Point instance at 0x00D96F80>

实际上,您可能更想使用__repr__而不是__str__

class Point():
    def __init__(self,x,y):
        self.x = x
        self.y = y
    def __repr__(self):
        return "Point x: {0}, Point y: {1}".format(self.x, self.y)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接