理解__repr__的问题,即使我已经删除它也不会打印任何内容

时间:2018-01-19 07:06:50

标签: python class object repr

所以昨天我尝试在我的代码中使用 repr str 来打印列表中的对象。这里只是我遇到同样问题的小例子代码。

class Something:
    def __init__(self):
        pass

    def __repr__(self):
        return "I want this out"

    def __str__(self):
        return "this comes out"

def main():

    k = Something()
    k
    print(k)

main()

印刷什么:

  

出来了

     

处理完成,退出代码为0

为什么我不能从我的对象中获取 repr ,即使我在调用对象时给它返回行?

2 个答案:

答案 0 :(得分:-1)

__repr__()__str__()用于不同目的。

  • __repr__'s目标明确无误
  • __str__'s目标是 可读

有一篇很棒的文章on this here

在您的情况下,您的代码只是引用k,希望这会显示k的repr版本。这适用于交互式提示,但不适用于脚本。在脚本中,要查看对象的repr表示,必须使用repr()函数。要查看对象的str()表示,通常必须使用str()函数。

值得注意的是,print()函数默认显示str表示,这就是为什么你可以打印它而不先显式调用str()

class Something:
    def __init__(self):
        pass

    def __repr__(self):
        return "I want this out"

    def __str__(self):
        return "this comes out"

def main():

    k = Something()
    print("repr:", repr(k))
    print("str:", str(k))
    print("defaults to calling str() if available: ", k)

main()

repr: I want this out
str: this comes out
defaults to calling str() if available:  this comes out

答案 1 :(得分:-2)

解释器运行代码有两种方法。 首先是REPL上下文(iPython shell,或ipdb debug env),在这种情况下,python解释器将调用__repr__函数,我在ipython环境中尝试过,它的工作原理如下:

In [1]: class Something(object):
   ...:
   ...:     def __repr__(self):
   ...:         return 'in __repr__'
   ...:

In [2]: k = Something()

In [3]: k
Out[3]: in __repr__

其次,当您按python xxx.py启动脚本或项目时,解释程序会调用__str__

我想你刚尝试过第二种方式。

希望这可以帮到你一点。