0

我创建了自己的 LIFO 容器类 Stack,它支持 push、len、pop 和检查 isEmpty 的方法。在我的示例调用中,所有方法似乎都在工作,除了当我调用此类的创建实例(在我的示例中)时,当我想查看该对象的实际内容时,我会收到创建对象的内存位置。

class Stack:

   x = []

    def __init__(self, x=None):
        if x == None:
            self.x = []
        else:
            self.x = x

    def isEmpty(self):
        return len(self.x) == 0
    def push(self,p):
        self.x.append(p)
    def pop(self):
        return self.x.pop()
    def __len__(self):
        return(len(self.x))


    s = Stack()    
    s.push('plate 1')
    s.push('plate 2')
    s.push('plate 3')
    print(s)
    print(s.isEmpty())
    print(len(s))
    print(s.pop())
    print(s.pop())
    print(s.pop())
    print(s.isEmpty())

我得到运行这条线的结果print(s)<__main__.Stack object at 0x00000000032CD748>t我期望和正在寻找的['plate 1','plate 2','plate3']

4

3 回答 3

3

您还需要覆盖__str__,或者__repr__如果您希望您的类在打印时具有不同的表示形式。就像是:

def __str__(self):
    return str(self.x)

应该做的伎俩。 __str__str函数调用的内容(并由 隐式调用print)。默认值__str__只是简单地返回结果,__repr__该结果默认为带有类型和内存地址的有趣字符串。

于 2013-04-17T22:52:30.517 回答
2

您需要覆盖__repr__. 否则它将使用返回类的非正式字符串表示的默认实现,在这种情况下是类型和内存地址。

def __repr__(self):
    return str(self.x)
于 2013-04-17T22:52:50.067 回答
0

是的,如果可能,覆盖__str__和/或__repr__ 记住__repr__可以评估并返回相同的对象

于 2013-04-17T23:01:36.697 回答