【发布时间】:2017-01-12 18:02:28
【问题描述】:
如果没有打印(我相信它会调用 str()),当变量单独位于一行时会发生什么。
这有点做作,我知道,但我在测试我正在创建的课程时在 Jupyter 笔记本中遇到了这个问题,现在我很好奇。我似乎无法找到正确的 Google 搜索字词集以在文档中找到答案。
我就这样定义了一个类:
class ExceptionList(BaseException):
pass
# I've implemented, in very standard ways, the following methods
# __str__()
# __getitem__()
# __delitem__()
# __repr__()
# I doubt any other specifics of the class are pertinent
编辑
这是 repr() 实现:
def __repr__(self):
return "{}({})".format(self.__class__.__name__, repr(self.__exception_list))
附:我根据http://brennerm.github.io/posts/python-str-vs-repr.html对该方法进行了编码
编辑
我的 repr() 实现导致了这种行为:
e = ExceptionList(["Oh, no"])
e
“异常列表(['哦,不'])”
所以考虑一下:
e1 = Exception("Oh no!")
e2 = ExceptionList("Oh no!")
在单独的笔记本单元格中:
e1
异常('哦,不!')
e2
__main__.ExceptionList()
顺便说一下(也许?)输出:
e2.__class__
接近了:
__main__.ExceptionList
它只是与定义类的范围有关吗?是内置函数的一些特殊行为吗?
这种行为是调用某些我不知道的方法的结果吗?我尝试实现使用dir() 生成的所有方法,尽管我敢打赌这并不详尽。
这可能对我的实现无关紧要,但现在我需要知道!
样板仇恨威慑:
- 我什么都不知道。
- 我是一个糟糕的程序员。
- “我以为蟒蛇是蛇……”
- 我几乎没有资格使用烤面包机。
- 请原谅这篇文章对 SO 磁盘空间的可悲使用。
【问题讨论】:
-
无法复制。 ExceptionList 产生与 Python 2 和 3 中的 Exception 相同的输出。
-
大概你已经定义了
__repr__来输出"__main__.ExceptionList()",因为这就是执行此操作的方法。 -
嗯,不完全是。看看我上面的编辑。 __repr__() 打印出实例的字符串表示,以便 eval() 可以用来重新创建它。
-
没有。
__repr__是在您自己键入实例时负责产生输出的方法。显然,当你这样做时,你会得到你描述的输出,因为 这就是你定义__repr__要做的事情。 -
这不是真的。我在 /__repr__() 的输出中也有类的参数。该类包含一个列表,该列表的 repr 在 ExceptionList 的括号内。另外,我的 repr 实现没有 /__main__ 前置。