4

是否有任何标准约定可以在 python 中打印对象。我知道如果我只是尝试打印对象,它将打印内存地址,但我想覆盖该方法并能够打印对象的人类可读格式以帮助调试。

人们是否遵循任何标准约定,或者它不是定义这种方法的好方法,而是有更好的选择?

4

4 回答 4

11

您可以覆盖__str____repr__方法。

没有关于如何实现该__str__方法的约定;它可以只返回您想要的任何人类可读的字符串表示形式。然而,关于如何实现该__repr__方法有一个约定:它应该返回对象的字符串表示,以便可以从该表示重新创建对象(如果可能的话),即eval(repr(obj)) == obj.

假设你有一个 class Point__str__并且__repr__可以这样实现:

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def __str__(self):
        return "(%.2f, %.2f)" % (self.x, self.y)
    def __repr__(self):
        return "Point(x=%r, y=%r)" % (self.x, self.y)
    def __eq__(self, other):
        return isinstance(other, Point) and self.x == other.x and self.y == other.y

例子:

>>> p = Point(0.1234, 5.6789)
>>> str(p)
'(0.12, 5.68)'
>>> "The point is %s" % p  # this will call str
'The point is (0.12, 5.68)'
>>> repr(p)
'Point(x=0.1234, y=5.6789)'
>>> p  # echoing p in the interactive shell calls repr internally
Point(x=0.1234, y=5.6789)
>>> eval(repr(p))  # this echos the repr of the new point created by eval
Point(x=0.1234, y=5.6789)
>>> type(eval(repr(p)))
<class '__main__.Point'>
>>> eval(repr(p)) == p
True
于 2012-11-05T09:33:09.277 回答
5

__str__在类中为您正在打印的对象 实现函数。

如果您要为无法更改的类打印对象,那么提供自己的print函数相当简单,因为您使用的是 Python 3。

编辑:通常返回的字符串__str__将特定于类,但至少足以识别对象。字符串的确切格式将根据类和公共属性而有所不同。

Edit2:这是一个描述国家/地区的类的简单(缩减)示例:

def __str__(self):
    return "{0:<32} {1:>010}".
        format(self.__name, self.__population)
于 2012-11-05T09:11:19.620 回答
3

如果您的对象可以以允许重新创建的方式表示,则覆盖该__repr__函数。例如,如果您可以使用以下代码创建对象:

MyObject('foo', 45)

应该__repr__返回。"MyObject('foo', 45)"然后,您不需要实现__str__.

但是如果对象太复杂以至于你不能那样表示它,那就重写吧__str__。然后,您应该返回一些东西,既清楚地表明该对象不能被重新创建,并且它是一个对象。因此,不要 return "foo:45",因为它看起来像一个字符串,或者{'foo': 45}因为它看起来像一个字典,这会让你在调试时感到困惑。

我建议您保留括号,例如<MyObject foo:45>. 这样一来,很明显您一直在打印一个对象,而且很明显,这不仅仅是MyObject('foo', 45)重新创建对象的写入问题,而是存储了更多数据。

于 2012-11-05T11:23:12.703 回答
1

打印有关对象(类实例)的自定义信息的标准方法是使用__str__方法:

class A:
    var = 1

    def __str__(self):
        return 'Accessing from print function, var = {0}'.format(self.var)

在这种方法中,您可以显示您想要的任何信息

a = A()
print(a)
>>> Accessing from print function, var = 1
于 2012-11-05T09:22:41.710 回答