python - __repr__ 方法出现无法为 Exception 类自动调用

标签 python python-3.x

有人告诉我,如果未创建对象的 __str__ 方法但创建了 __repr__,则打印对象将调用 __repr__。这对于普通类来说似乎是正确的,但是当我在 Exception 的子类上尝试它时,奇怪的是 __repr__ 没有被调用,谁能解释为什么?

举个例子

class BoringError(Exception):
  def __init__(self):
    self.purpose = "Demonstration"
    self.boringLevel = 10
  def __repr__(self):
    return "I'm a message for developer"

 try: 
   if 1 != 2:
    raise BoringError 
 except BoringError as e:
   print(e.boringLevel)
   print(e)

class Tree:
  def __repr__(self):
    return "I love water"

AVL = Tree()
print(AVL)

该程序产生以下结果

10

I love water

代替

10
I'm a message for developer
I love water

最佳答案

__repr__ 仅在 e.__str__ 解析为 object.__str__ 时调用,其基本定义如下

def __str__(self):
    return self.__repr__()

在您的情况下,object.__str__ 永远不会被调用,因为 e.__str__ 解析为 Exception.__str__ 调用__repr__ 的任何定义。比较:

>>> e = Exception("hi")
>>> print(e)
hi
>>> str(e)
'hi'
>>> repr(e)
"Exception('hi')"

Tree.__str__ 未定义,因此 AVL.__str__ 确实解析为 object.__str__,因此Tree.__repr__ 被调用。

关于python - __repr__ 方法出现无法为 Exception 类自动调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56023376/

相关文章:

python - imageio在哪里找到 'chelsea.png'

python - sys.getrefcount() 返回远高于 2 的值

python - 基于其他列中的分类值的同一列的不同聚合总和

python - 重写方法还是派生?

python - 将嵌套的 for 循环转换为等效的 map

python - 从 ImageGrab 定位黑色像素的位置

Python3.8 : What's the difference between ImportError and ModuleNotFoundError

python - 如何在Python中增量打印字符串中的字符

python - Django makemigrations 为未更改的模型字段创建新的迁移文件

python - ANTLR 3.5.1(最新的 3.x 版本)和 Python 运行时 3.1.3(仅可用的 Python 运行时)