江户川乱折腾
这里有两点需要注意:当 REPL 评估一个对象时,它使用它的__repr__方法来表示。您的__str__方法将导致错误,因为它不返回字符串。运行代码后,可以观察到以下行为:>>> s.stack>>> ['Plate 1', 'Plate 2', 'Plate 3']>>> print(s)[...]TypeError: __str__ returned non-string (type list)>>> repr(s)>>> '<__main__.Stack object at 0x7fe358f7e240>'要解决这些问题,请执行__repr__,例如像这样:def __repr__(self): return repr(self.stack)现在>>> s>>> ['Plate 1', 'Plate 2', 'Plate 3']显示内容s.stack。此外,您可以删除该__str__方法,因为在打印时,__repr__将在没有__str__实现时作为回退调用。>>> del Stack.__str__>>> print(s)['Plate 1', 'Plate 2', 'Plate 3']如果您想保留__str__,请确保修改它以返回一个str对象,否则您将获得TypeError如上所示的 a 。多一点关于__repr__:理想情况下,该方法应该返回一个字符串,这样当复制粘贴到解释器中时,将构建一个相等的对象。由于您的__init__方法不接受任何参数,因此此处无法显示信息字符串,该字符串将被评估为 的实例Stack并同时显示堆栈的内容。如果您更改__init__到def __init__(self, iterable=None): if iterable is None: self.stack = [] else: self.stack = list(iterable)你可以__repr__改为def __repr__(self): return 'Stack({!r})'.format(self.stack)实现时看起来像这样:>>> s>>> Stack(['Plate 1', 'Plate 2', 'Plate 3'])... eval'ing 这个字符串将创建一个Stack具有相同内容的。当我们这样做时,请考虑实施__eq__良好的措施......def __eq__(self, other): return isinstance(other, Stack) and self.stack == other.stack......这样:>>> s == eval(repr(s))>>> True