【问题标题】:python why does it call __str__ instead of __repr__ and why is the print(obj) not working and throws exceptionpython 为什么它调用 __str__ 而不是 __repr__ 以及为什么 print(obj) 不起作用并抛出异常
【发布时间】:2021-03-01 18:28:28
【问题描述】:

我有一个小问题,因为每当我在 try/except 部分运行代码 print(obj) 时,它都会引发异常。我用调试工具跟踪它,它直接在 str 方法中跳转,但我编写了 str 方法只是为了测试。通常我认为它会跳转到普通类调用的 repr 方法中。 代码在 str() 方法的返回命令中中断。 我只是想更改 time.time_struct 类的输出,因为我需要字符串和属性表示。 打印命令仅用于显示结果,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

【问题讨论】:

  • print 调用str,而不是repr
  • 如果您的代码引发异常,如果您不知道是什么原因导致的,请不要忽略它。

标签: python string class call repr


【解决方案1】:

如果您没有发现异常(或者如果您重新提出它以查看您捕获的内容),您会发现问题在于您对 __str__ 和 @987654322 的定义@。您正在尝试将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

【讨论】:

  • 要注意:"" + ... 是非常没有意义的。用空字符串前缀任何东西......什么都没有。