使用Python解释器时,只需编写
3+4
使其打印' 7'
但是在导入某些课程(' Something',它有自己的 str 和添加已实施)并执行此操作时:
a=Something(var2)
b=Something(var2)
a+b
解释器只是打印一条报告动作的消息(编辑:这个,我的意思是消息class.Something对象在0xspam ...,这是 repr 的输出,当它'实际上没有实现,当我以为我得到类似 str 的输出的东西时,它不会打印刚刚创建的新对象的str版本
为什么会这样?如何改变?
编辑: 这个问题与对 str 和 repr 的混淆有关(当我问这个时,我还不知道 repr 存在问题),我认为一个类实现 str 就足以从对象中获取字符串,并且能够直接将它打印到解释器而无需编写&# 39;打印&#39 ;.但后者实际上是通过适当实施 repr 来实现的
答案 0 :(得分:1)
这是一个实现了add
的类:
class A(object):
def __init__(self, x):
self.x = x
def __add__(self, other):
return self.__class__(self.x + other.x)
def __repr__(self):
return "%s with x=%s" % (self.__class__, self.x)
现在,让我们创建一些实例并添加它们:
>>> a = A(3); b = A(2)
>>> a + b
<class 't.A'> with x=5
是的,打印出来。
如果没有上面定义的自定义__repr__
,那么打印将是通常的默认表示,例如:
<t.A object at 0x7f7d7bc9f990>
答案 1 :(得分:1)
以下是口译员使用的规则:
除了表达式声明之外的任何内容,都不会打印任何内容。
对于表达式语句,结果被分配给_
,然后相应的代码发生:
if _ is not None:
try:
print(repr(_))
except Exception as e:
print(<some message with e and object.__repr__(_)>)
这就是它的全部内容。
因此,如果没有打印任何内容,最有可能的是a+b
在这里返回None
。例如,您忘记向我们展示的Something.__add__
可能如下所示:
def __add__(self, other):
tmp = copy.copy(self)
tmp += other
# oops, no return tmp
或者a+b
可能会返回repr
为空字符串或所有空格的对象,而您没有注意到它打印了一个空行。
如果某些 正在打印,但它不是您所期望的,那么__repr__
可能没有按照您的预期定义。由于您只提到定义__str__
,您可能没有意识到__repr__
是一个单独的函数,如果您只是继承默认值,它往往看起来像<__main__.Spam at 0x115f018d0>
。
答案 2 :(得分:0)
print a+b
而非a+b
,当然
至于为什么a+b
不会导致在对象上调用str(),我不知道。