看起来__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++中设置为“private”的内容不会被作为构造函数的参数轻易接受,使用该类的队友必须使用接口函数进行设置,即使这对他们来说更加繁琐。在这种情况下,我将定义一个不接受某些参数的构造函数,并定义一个稍微难以注意到的单独函数,用于__repr__
的目的。
如果有所区别,我计划使用它们的__repr__
输出将这些Python对象存储在数据库中,并使用eval()
检索它们,至少在没有找到更好方法之前是这样的。队友手动创建完整对象而不是通过适当的接口函数进行操作的后果只是一种类型的信息检索可能不稳定,直到有人弄清楚他做了什么。
eval(repr(re.compile("doesn't work")))
,其中re
是正则表达式模块。 - user166390