__repr__
该函数 似乎有不同的返回方式。
我有一个类 InfoObj 存储了许多东西,其中一些我不特别希望该类的用户自己设置。我认识到在 python 中没有任何东西受到保护,他们可以直接潜入并设置它,但似乎定义它__init__
使得有人更有可能看到它并认为只需传递它就可以了。
(示例:验证函数在确定对象已完全填充时设置的布尔值,以及在存储足够信息时从其他值计算的值...例如 A = B + C,所以一次设置 A 和 B 然后计算 C 并将对象标记为 Valid=True。)
那么,考虑到所有这些,设计 __repr__ 输出的最佳方式是什么?
bob = InfoObj(Name="Bob")
# Populate bob.
# Output type A:
bob.__repr__()
'<InfoObj object at 0x1b91ca42>'
# Output type B:
bob.__repr__()
'InfoObj(Name="Bob",Pants=True,A=7,B=5,C=2,Valid=True)'
# Output type C:
bob.__repr__()
'InfoObj.NewInfoObj(Name="Bob",Pants=True,A=7,B=5,C=2,Valid=True)'
... C 类型的要点是不要愉快地将我在 C++ 中设置为“私有”的所有东西作为构造函数的参数,并让使用该类的队友使用接口函数设置它,即使它需要更多工作为他们。在这种情况下,我将定义一个不包含某些内容的构造函数,以及一个稍微难以注意到的单独函数__repr__
如果有什么不同,我计划使用它们的__repr__
输出将这些 python 对象存储在数据库中,并使用 检索它们eval()
,至少除非我想出更好的方法。队友手动创建完整对象而不是通过适当的接口函数的结果只是一种类型的信息检索可能不稳定,直到有人弄清楚他做了什么。