对于自定义Python类,哪个更好__repr__?

时间:2011-06-15 02:47:20

标签: python constructor repr

似乎__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 ++中设置为'private'的所有东西作为构造函数的参数,并使使用该类的队友使用接口函数设置它,即使这对他们来说更有用。在这种情况下,为了__repr__

的目的,我将定义一个不接受某些内容的构造函数,以及一个稍微难以注意的单独函数。

如果它有所不同,我打算使用__repr__输出将这些python对象存储在数据库中,并使用eval()检索它们,至少除非我想出更好的方法。队友手动创建完整对象而不是通过正确的界面函数的结果只是一种类型的信息检索可能不稳定,直到有人弄清楚他做了什么。

1 个答案:

答案 0 :(得分:9)

__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(...)

如果您使用较旧的Python(3.x之前版本),请注意cPickle更快,但pickle更具可扩展性。 Pickle将在没有任何配置的情况下处理您的某些类,但对于更复杂的对象,您可能需要编写自定义选择器。