编写 repr 方法

2023-11-25

情况: 我是Python新手,目前正在尝试学习诀窍,我尝试创建一个链表类来帮助更好地理解该语言及其结构。我知道__repr__函数基本上应该返回相同的东西__str__但我不确定实际的区别是什么。

到目前为止,这是我的课程:

class LinkedList:
    class Node:
        def __init__(self, val, prior=None, next=None):
            self.val = val
            self.prior = prior
            self.next  = next

    def __init__(self):
        self.head = LinkedList.Node(None) 
        self.head.prior = self.head.next = self.head 
        self.length = 0

    def __str__(self):
        """Implements `str(self)`. Returns '[]' if the list is empty, else
        returns `str(x)` for all values `x` in this list, separated by commas
        and enclosed by square brackets. E.g., for a list containing values
        1, 2 and 3, returns '[1, 2, 3]'."""
        if len(self)==0:
            return '[]'
        else:
            return '[' +  ', '.join(str(x) for x in self) + ']'

    def __repr__(self):
        """Supports REPL inspection. (Same behavior as `str`.)"""
        return '[' +  ', '.join(str(x) for x in self) + ']'

当我针对下面的代码测试此代码时,我会收到一个错误,基本上表明使用 repr 函数时实际上并未返回空白字符串“[]”。我如何编辑此方法主体来解决此问题?我也尝试过return str(self)我也不知道为什么这不起作用。

from unittest import TestCase
tc = TestCase()

lst = LinkedList()
tc.assertEqual('[]', str(lst))
tc.assertEqual('[]', repr(lst))

lst.append(1)
tc.assertEqual('[1]', str(lst))
tc.assertEqual('[1]', repr(lst))

The __repr__函数返回 Python 对象的字符串表示形式,Python 解释器可以对其进行评估以实例化该对象的另一个实例。所以如果你有一个清单:

x = ['foo', 'bar']

Its __repr__字符串将是:

x_str = repr(x)
print(x_str)
>>>>
"['foo', 'bar']"

你可以这样做:

x2 = eval(x_str)
print(type(x2))
>>>>
<class 'list'>

这是一种获取 Python 对象的字符串表示形式的方法,该对象可以转换回所述对象的新实例。

基本上之间的区别__str__ and __repr__前者返回要由人读取的对象的字符串表示形式,后者返回要由 Python 解释器解析的对象的字符串表示形式。对此要非常小心!

在您的示例代码中,看起来__str__ and __repr__返回相同的字符串表示形式。没关系。然而,如果你愿意,你可以让你的__str__返回一些更漂亮的格式版本(例如带有回车符且没有括号),但是__repr__应始终返回一个可由 Python 解释器解析以重建对象的字符串。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编写 repr 方法 的相关文章

随机推荐

Powered by Hwhale