当我输入一个存储对象的变量时,它会不断返回该对象的实例,而不是我希望它返回的列表

class Stack(object):


    def __init__(self):

        self.stack = []


    def __str__(self):

        return 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")

>>> s

<__main__.Stack object at 0x0000017E06ED4E10>


守着一只汪
浏览 172回答 3
3回答

江户川乱折腾

这里有两点需要注意:当 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):&nbsp; &nbsp; 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):&nbsp; &nbsp; if iterable is None:&nbsp; &nbsp; &nbsp; &nbsp; self.stack = []&nbsp; &nbsp; else:&nbsp; &nbsp; &nbsp; &nbsp; self.stack = list(iterable)你可以__repr__改为def __repr__(self):&nbsp; &nbsp; return 'Stack({!r})'.format(self.stack)实现时看起来像这样:>>> s>>> Stack(['Plate 1', 'Plate 2', 'Plate 3'])... eval'ing 这个字符串将创建一个Stack具有相同内容的。当我们这样做时,请考虑实施__eq__良好的措施......def __eq__(self, other):&nbsp; &nbsp; return isinstance(other, Stack) and self.stack == other.stack......这样:>>> s == eval(repr(s))>>> True

临摹微笑

您可以返回列表,而不是self.stack从__str__()函数中返回“ ” ,如下所示:class Stack(object):def __init__(self):&nbsp; &nbsp; self.stack = []def __str__(self):&nbsp; &nbsp; return str(list(plates for plates in self.stack))def push(self, item):&nbsp; &nbsp; self.stack.append(item)def pop(self):&nbsp; &nbsp; popped = self.stack.pop()&nbsp; &nbsp; print(popped)def isEmpty(self):&nbsp; &nbsp; if len(self.stack) == 0:&nbsp; &nbsp; &nbsp; &nbsp; print("True")&nbsp; &nbsp; else:&nbsp; &nbsp; &nbsp; &nbsp; print("False")def __len__(self):&nbsp; &nbsp; 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']
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python