【问题标题】:Why __str__(self) doesn't work when calling the print() function?为什么调用 print() 函数时 __str__(self) 不起作用?
【发布时间】:2022-06-29 20:33:29
【问题描述】:

我正在深入研究 OOP 并学习魔法(或 dunder)技术。 Python 3.8.8。

我使用 pop() 方法创建了类 FreqStack(),该方法删除最频繁的元素并返回更新的堆栈。

class FreqStack():

def __init__(self, lst:list = None):
    if lst is None:
        self.stack = []
    else:
        self.stack = lst[::-1]

def push(self, el: int):
    self.stack.insert(0, el)
    return self.stack

def pop(self):
    if len(self.stack) != 0:
        hash_map = {}
        for el in self.stack:
            hash_map[el] = hash_map.get(el, 0) + 1
        most_freq_el = max(hash_map, key=hash_map.get)

        while most_freq_el in self.stack: 
            self.stack.remove(most_freq_el)
        
        return self.stack 
    else:
        return 'Stack is empty!'
    
def __str__(self):
    return '\n|\n'.join(str(el) for el in self.stack)

我还添加了 dunder 方法 str(),据我正确理解,该方法在调用 print() 函数时必须返回自定义字符串。 但是,下面示例中的 print() 函数不是返回字符串,而是返回一个列表。

lst = [1, 1, 1, 5, 5, 5, 3, 3, 3, 7, 7, 9]
freq_stack = FreqStack(lst)

for i in range(6):
    print(freq_stack.pop())

Output:
[9, 7, 7, 5, 5, 5, 1, 1, 1]
[9, 7, 7, 1, 1, 1]
[9, 7, 7]
[9]
[]
Stack is empty!

我搜索了与此问题相关的所有内容,但无法解决。我做错了什么?

【问题讨论】:

  • 你永远不会在你的 FreqStack 对象上调用 print。
  • 因为你不是print 你的freq_stack 但无论它的.pop() 方法返回什么,所以self.stack 这是一个列表。
  • 另外,打印函数不返回列表。也不是一串。就此而言,它不会返回任何东西。它将一些字符输出到标准输出。

标签: python string oop


【解决方案1】:

您正在打印pop 的返回值,而不是freq_stack 本身。 __str__ 方法适用于 freq_stack 对象,因此您可以尝试以下方法:

freq_stack.pop()
print(freq_stack)

【讨论】:

  • 感谢您的清晰解释:)
最近更新 更多