3 回答

TA貢獻1851條經(jīng)驗 獲得超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>'
要解決這些問題,請執(zhí)行__repr__,例如像這樣:
def __repr__(self):
return repr(self.stack)
現(xiàn)在
>>> s
>>> ['Plate 1', 'Plate 2', 'Plate 3']
顯示內(nèi)容s.stack。此外,您可以刪除該__str__方法,因為在打印時,__repr__將在沒有__str__實現(xiàn)時作為回退調(diào)用。
>>> del Stack.__str__
>>> print(s)
['Plate 1', 'Plate 2', 'Plate 3']
如果您想保留__str__,請確保修改它以返回一個str對象,否則您將獲得TypeError如上所示的 a 。
多一點關(guān)于__repr__:
理想情況下,該方法應(yīng)該返回一個字符串,這樣當復(fù)制粘貼到解釋器中時,將構(gòu)建一個相等的對象。由于您的__init__方法不接受任何參數(shù),因此此處無法顯示信息字符串,該字符串將被評估為 的實例Stack并同時顯示堆棧的內(nèi)容。
如果您更改__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)
實現(xiàn)時看起來像這樣:
>>> s
>>> Stack(['Plate 1', 'Plate 2', 'Plate 3'])
... eval'ing 這個字符串將創(chuàng)建一個Stack具有相同內(nèi)容的。
當我們這樣做時,請考慮實施__eq__良好的措施......
def __eq__(self, other):
return isinstance(other, Stack) and self.stack == other.stack
......這樣:
>>> s == eval(repr(s))
>>> True

TA貢獻1982條經(jīng)驗 獲得超2個贊
您可以返回列表,而不是self.stack從__str__()函數(shù)中返回“ ” ,如下所示:
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']
添加回答
舉報