我正在学习Python中的绳索 . 当我尝试使用 print() 函数打印类 Foobar 的对象时,我得到如下输出:
<__main__.Foobar instance at 0x7ff2a18c>
有没有办法可以设置类及其对象的打印行为(或字符串表示)?例如,当我在类对象上调用 print()
时,我想以某种格式打印其数据成员 . 如何在Python中实现这一点?
如果您熟悉C类,则可以通过为类添加 friend ostream& operator << (ostream&, const Foobar&) 方法来实现上述标准 ostream .
11 回答
__str__
方法是打印时发生的方法,__repr__
方法是使用repr()函数时(或者当您使用交互式提示查看它时) . 如果这不是最恐怖的方法,我道歉,因为我还在学习 - 但它有效 .如果没有给出
__str__
方法,Python将打印__repr__
的结果 . 如果您定义__str__
但不是__repr__
,Python将使用您在上面看到的__repr__
,但仍然使用__str__
进行打印 .As Chris Lutz mentioned,这是由您 class 中的
__repr__
方法定义的 .从repr()的文档:
鉴于以下课程测试:
..it将在Python shell中采用以下方式:
如果没有定义
__str__
方法,print(t)
(或print(str(t))
)将使用__repr__
的结果如果没有定义
__repr__
方法,则使用默认值,这几乎相当于..可以应用于没有特定格式的任何类的通用方法可以按如下方式完成:
然后,
产生
只是将我的两分钱加到@dbr的答案中,以下是如何从他引用的官方文档中实现这句话的一个例子:
鉴于此类定义:
现在,很容易序列化
Test
类的实例:所以,运行最后一段代码,我们将得到:
但是,正如我在上一篇评论中所说:更多信息只是here!
你需要使用
__repr__
. 这是一个像__init__
这样的标准函数 . 例如:对于Python 3:
如果特定格式不重要(例如,用于调试),只需继承下面的Printable类 . 无需为每个对象编写代码 .
灵感来自this答案
@ user394430的一个更漂亮的响应版本
生成视觉上很好的名称和值列表 .
一个更加漂亮的版本(感谢Ruud)对这些项目进行排序:
在这个帖子中已经有很多答案,但是没有一个特别对我有帮助,我必须自己解决,所以我希望这个有一点信息量 .
你必须确保在课程结束时有括号,例如:
这是我正在处理的项目的代码示例:
要打印我的Hydrogen类,我使用了以下内容:
请注意,如果没有Hydrogen末端的括号,这将无效 . 他们是必要的 .
希望这有帮助,如果您有任何疑问,请告诉我 .
只需在您的 class 中使用 "str" 特殊方法 . 对于前者
类Adiprogrammer:
yash = Adiprogrammer(“Aaditya”)
打印(佳日)
如果您遇到类似@Keith的情况,可以尝试:
这违背了我认为好的风格,但如果你只是试图调试那么它应该做你想要的 .
这些都没有真正帮助我 . 我不希望使用继承,甚至将这些 str 函数放在我的 class 中 . 这意味着我宁愿拥有一个Class并打印出整个类的内容 . IOW:有类似的东西
这将打印如下:
关于用法的简单和简单,以及我不必更改原始对象定义的想法 . 如果我必须创建一个解构对象的小函数,我就可以了 . 因为我可以简单地调用知道如何操作的函数 . 我可以在不改变原始类定义的情况下使用它 .