3 回答
TA贡献1851条经验 获得超5个赞
这里有两点需要注意:
当 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
TA贡献1982条经验 获得超2个赞
您可以返回列表,而不是self.stack从__str__()函数中返回“ ” ,如下所示:
class Stack(object):
def __init__(self):
self.stack = []
def __str__(self):
return str(list(plates for plates in self.stack))
def push(self, item):
self.stack.append(item)
def pop(self):
popped = self.stack.pop()
print(popped)
def isEmpty(self):
if len(self.stack) == 0:
print("True")
else:
print("False")
def __len__(self):
return len(self.stack)
s = Stack()
s.push("Plate 1")
s.push("Plate 2")
s.push("Plate 3")
print(s)
输出:
['Plate 1', 'Plate 2', 'Plate 3']
添加回答
举报