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

标签 python constructor repr

__repr__ 函数似乎有不同的返回方式。

我有一个 InfoObj 类,它存储了很多东西,其中一些我并不特别希望类的用户自己设置。我认识到 python 中没有任何内容是 protected ,他们可以直接潜入并设置它,但似乎在 __init__ 中定义它使得更有可能有人看到它并假设将它传递进去就可以了。

(示例:验证函数在确定对象已完全填充时设置的 bool 值,以及在存储足够信息时从其他值计算的值...例如 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)”的所有东西作为构造函数的参数,并让使用该类的队友使用接口(interface)函数设置它,即使这对他们来说是更多的工作。在那种情况下,为了 __repr__

的目的,我会定义一个不接受某些东西的构造函数,以及一个稍微难以注意到的单独函数

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

最佳答案

__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 无需任何配置即可在您的某些类上工作,但对于更复杂的对象,您可能需要编写自定义 pickler。

关于python - 对于自定义 Python 类,哪个 __repr__ 更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6352484/

相关文章:

python - 查找 Pandas 数据帧发生列变化的索引

python - 为什么 numpy.array() 有时很慢?

c++ - 从子类的构造函数体调用基类的构造函数

python - 从 python `dataclass` `__repr__` 中排除默认字段

python - 如何从 Pandas HDF 存储中读取 nrows?

python - 无法使 Mypy 使用 __init__.py 别名

javascript - 请解释有关javascript中原型(prototype)属性和函数构造函数的详细信息

c++ - 构造函数的参数数量

python - 在 set 的子类上调用 super().__repr__() 时出现意外行为?

python - 对象列表的自定义列表表示