【问题标题】:Python proper use of __str__ and __repr__Python 正确使用 __str__ 和 __repr__
【发布时间】:2010-05-11 17:06:28
【问题描述】:

我当前的项目需要大量使用位域。我找到了一个简单、实用的recipe for bit a field class,但它缺少一些我需要的功能,所以我决定扩展它。我刚刚实施了__str____repr__,我想确保我遵守约定。

__str__ 应该是非正式的和简洁的,所以我让它返回位字段的十进制值(即str(bit field 11) 将是"3"

__repr__ 应该是对象的官方表示,所以我让它返回实际的位字符串(即repr(bit field 11) 将是"11")。

您认为此实现是否符合strrepr 的约定?

另外,我使用了bin() 函数来获取存储在类中的值的位串。这与 Python

干杯,

皮特

【问题讨论】:

  • 有可用的位域模块,例如 bitstring、bitarray 和 bitvector(检查 PyPi)。如果您不想重新发明轮子,可能值得一试。
  • 我知道我在这里重新发明轮子,但我做这个项目是为了好玩,而且使用其他人在这种情况下编写的代码令人不满意(我知道很傻!)。跨度>

标签: python bit-manipulation conventions representation


【解决方案1】:

__repr__ 最好是一个可用于重新创建对象的字符串,例如,如果您在其上使用eval - 请参阅文档here。这不是一门精确的科学,因为它可能取决于模块的用户如何导入它。

我会让__str__ 返回二进制字符串,__repr__ 返回Classname(binary_string),或者任何可以用来重新创建对象的东西。

bitstring 模块(我维护)中,__str__ 如果位串是 4 位长的倍数,则为十六进制,否则为二进制或两者的组合。此外,如果位串很长,则会被截断(您不想尝试在交互式会话中打印 100 MB 位串!)

如果我是你,我会完全避免使用 bin() 函数。原因是如果您的位串以零位开头,则无法使用它(请参阅我的问题here)。我建议改用bin 方法或属性。

【讨论】:

  • 同意。我认为作为一项规则 eval(repr(x)) 应该尽可能地重新创建 x。不确定str,但我喜欢这个解决方案。
【解决方案2】:

我会考虑让__str__ 返回一个十六进制表示。这样,更容易观察实际位值是什么,因此更有用。但仍然相当简洁(实际上,比十进制表示的字符更少)。

【讨论】:

    【解决方案3】:

    __repr__ 需要返回一些内容,如果将其传递给您的构造函数,则会创建一个与原始对象完全相同的新对象。

    Yours 返回 '11' 但如果将 '11' 传递给构造函数,您将不会得到相同的位域。所以这个__repr__不行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-06
      • 2013-08-25
      • 2021-09-11
      • 2018-11-23
      • 1970-01-01
      • 2012-06-14
      • 2013-03-19
      • 2013-01-28
      相关资源
      最近更新 更多