为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

守着一只汪 2021-08-17 11:03:59
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>
查看完整描述

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


查看完整回答
反对 回复 2021-08-17
?
临摹微笑

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']


查看完整回答
反对 回复 2021-08-17
  • 3 回答
  • 0 关注
  • 169 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信