Bri*_*ian 8 python constructor repr
似乎__repr__函数可以返回不同的方式.
我有一个InfoObj类,它存储了很多东西,其中一些我并不特别希望自己设置类的用户.我意识到没有什么蟒蛇是受保护的,他们可能只是潜水,并设置也无妨,但似乎在定义它__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)'
Run Code Online (Sandbox Code Playgroud)
...类型C的要点是不愉快地将我在C++中设置为"私有"的所有东西作为构造函数的参数,并让使用该类的队友使用接口函数设置它,即使它更多的工作对他们来说 在这种情况下,我将定义一个不带某些东西的构造函数,以及一个稍微难以注意到的单独函数,用于__repr__
如果它有所不同,我打算使用它们的__repr__输出将这些python对象存储在数据库中并使用它们进行检索eval(),至少除非我想出更好的方法.队友手动创建完整对象而不是通过正确的接口函数的结果只是一种类型的信息检索可能不稳定,直到有人弄清楚他做了什么.
Die*_*Epp 11
该__repr__方法旨在为开发人员而不是最终用户生成最有用的输出,因此只有您才能真正回答这个问题.但是,我通常使用选项B.选项A不是很有用,选项C不必要地冗长 - 你不知道你的模块是如何导入的.其他可能更喜欢选项C.
但是,如果要存储Python对象是一个数据库,请使用pickle.
import pickle
bob = InfoObj(Name="Bob")
> pickle.dumps(bob)
b'...some bytestring representation of Bob...'
> pickle.loads(pickle.dumps(bob))
Bob(...)
Run Code Online (Sandbox Code Playgroud)
如果你使用的是较旧的Python(3.x之前的版本),那么请注意它cPickle更快,但pickle更具可扩展性.Pickle将在没有任何配置的情况下处理您的某些类,但对于更复杂的对象,您可能希望编写自定义选择器.