自定义Python数据结构

时间:2014-09-08 01:48:22

标签: python

我有一个包含来自deque的python collections的类。当我去创建一个deque x=deque()时,我创建了一个空的deque对象。所以,如果我填写它:x.append(0)并只需在控制台上键入x,我就会得到:

In[78]: x
Out[78]: deque([0])

我的问题是当我有一个类deque的包装器时,如何输出与上面相同的内容。例如。

class deque_wrapper:
    def __init__(self):
        self.data_structure = deque()

    def newCustomAddon(x):
        return len(self.data_structure)

In[74]: x = deque_wrapper()
In[75]: x
Out[75]: <__main__.deque_wrapperat 0x7e3d0f0>

我想自定义打印出来的内容,而不仅仅是内存位置。我该怎么办?

2 个答案:

答案 0 :(得分:3)

委派代表的生成。

class deque_wrapper:
   ...
  def __repr__(self):
    return repr(self.data_structure)

答案 1 :(得分:3)

  

我想自定义打印出来的内容,而不仅仅是内存位置。我该怎么办?

这正是__repr__的用途:

  

repr()内置函数调用,以计算对象的“官方”字符串表示形式。如果可能的话,这应该看起来像一个有效的Python表达式,可用于重新创建具有相同值的对象(给定适当的环境)。如果无法做到这一点,则应返回<...some useful description...>形式的字符串。

因为你没有定义__repr__,所以你从object获得默认实现(假设Python 3 ...否则,你写了一个经典类,这是一个坏主意,当你可以停止使用它们时,你不想学习它们如何得到它们的默认值...),它只返回带有对象类型名称和地址的字符串。

请注意文档中__str__下方的__repr__方法__repr__。如果最易读的表示形式和有效的Python表达式表示不相同,请定义两种方法。否则,只需定义__str__,默认情况下deque将使用它。


因此,如果您要打印与__repr__完全相同的内容,只需委托def __repr__(self): return repr(self.data_structure)

def __repr__(self):
    return '{}({!r})'.format(type(self).__name__, self.data_structure)

如果你想把它包装成某种东西:

repr

请注意,我没有在第二个版本中调用!r,因为这正是deque在格式字符串中的含义。但实际上,在这种情况下,你不需要 ; str具有相同的repr和{{1}}。