Python解释器的输出?

时间:2014-11-07 01:05:57

标签: python class object interpreter

使用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 来实现的

3 个答案:

答案 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(),我不知道。