python 为什么它调用 __str__ 而不是 __repr__ 以及为什么 print(obj) 不工作并抛出异常

python why does it call __str__ instead of __repr__ and why is the print(obj) not working and throws exception

我有一个小问题,因为每当我 运行 try/except 部分中的代码 print(obj) 时,它都会抛出异常。我用调试工具跟踪它,它直接跳转到 str 方法,但我编码 str 方法只是为了测试。通常我认为它会跳入正常 class 调用的 repr 方法。 代码在 str() 方法的 return 命令中中断。 我只是想更改 time.time_struct class 的输出,因为我需要字符串和属性表示。 打印命令仅用于显示结果,init 语句中的块有效,但在 try/Except 块中不起作用。 有人有想法吗?

import time

class timeSelf():

def __init__(self,str):
    self.obj = time.strptime(str, "%H:%M")
    print(self.obj.tm_hour)
    print(type(self.obj))
def __repr__(self):
    return "" + self.obj.tm_hour + ":" + self.obj.tm_min

def __str__(self):
    return "" + self.obj.tm_hour + ":" + self.obj.tm_min

if __name__ == "__main__":
str= "16:54"
try:
    obj = timeSelf(str)
    print(obj)
    print(type(obj))
    print(type(obj.tm_hour))
except Exception:
    print("stuff happened")
    pass

如果您没有捕捉到异常(或者如果您重新引发它以查看您 捕捉到了什么 ),您会发现问题出在您对 __str____repr__。您正在尝试将 int"" 值与 + 组合,并且 没有 自动将 int 转换为 str发生在那里。

Traceback (most recent call last):
  File "tmp.py", line 19, in <module>
    print(obj)
  File "tmp.py", line 13, in __str__
    return "" + self.obj.tm_hour + ":" + self.obj.tm_min
TypeError: can only concatenate str (not "int") to str

你必须明确:

return "" + str(self.obj.tm_hour) + ":" + str(self.obj.tm_min)

或更简单地说:

return f"{self.obj.tm_hour}:{self.obj.tm_min}"

f-strings do 根据需要调用 __str__{...} 中的值转换为 str.