我有一个包含来自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>
我想自定义打印出来的内容,而不仅仅是内存位置。我该怎么办?
答案 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}}。