python - 在 __str__ 下调用 print(self) 会引发 RecursionError
问题描述
我定义了一个名为 spam 的类:
class spam():
def __str__(self):
print(self)
a = spam()
print(a)
最后的打印语句给了我以下错误:
Traceback (most recent call last):
File "<pyshell#73>", line 1, in <module>
print(a)
File "<pyshell#51>", line 3, in __str__
print(self)
File "<pyshell#51>", line 3, in __str__
print(self)
File "<pyshell#51>", line 3, in __str__
print(self)
#same lines repeated several times
RecursionError: maximum recursion depth exceeded
这里发生了什么?当我在 str(self) 下说 print(self) 时会发生什么?是什么导致了递归?
解决方案
print
调用str
非字符串对象以便能够打印它,这会调用您的__str__
成员方法。
这是你的递归。
__str__
当您能够将对象转换为“等效”字符串时,您就定义了一个方法。如果没有,请保留默认值(打印对象类型和地址)
请注意,__str__
应该返回一些东西,而不是打印。如果你有一些代表性的属性,你可以用它来返回一些有趣的东西。
class spam():
def __init__(self,value):
self.__value = value
def __str__(self):
return "object '{}' with value {}".format(self.__class__.__name__, self.__value)
a = spam(10)
print(a)
印刷:
object 'spam' with value 10
推荐阅读
- mysql - SQLSTATE[22023]:无效参数值:3037 提供给函数 mbrcontains 的 GIS 数据无效
- python - 总线错误:两个矩阵相乘时为 10
- woocommerce - woocommerce 交易电子邮件:使用 g 套件或 mailgun?建议和经验
- xamarin.forms - 如何以xamarin形式找到两点之间的行驶距离
- javascript - HTML 游戏中的 JS 无法运行
- python - Python 返回单行代码的行为与多行代码不同
- javascript - 在函数上调用 `call()` 不会通过 promise 传递 `this` 参数
- c# - 更改 GUID 中的两个字节
- jquery - 制作背景图片可点击
- azure-devops - 如何防止触发基于提交标记的 Azure DevOps 构建管道?