用于在python中打印对象的约定

时间:2012-11-05 09:08:41

标签: python python-3.x

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

有没有人遵循的标准惯例,或者它不是定义这种方法的好方法,而是有更好的选择?

4 个答案:

答案 0 :(得分:10)

您可以覆盖__str____repr__方法。

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

假设您有一个班级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

答案 1 :(得分:5)

在要打印的对象的类中实现函数__str__

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

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

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

def __str__(self):
    return "{0:<32} {1:>010}".
        format(self.__name, self.__population)

答案 2 :(得分:3)

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

MyObject('foo', 45)

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

但是如果对象太复杂而你无法像那样表示,那么改为覆盖__str__。然后,您应该返回一些既清楚又无法重新创建对象的内容,并且它是一个对象。因此,不要返回"foo:45",因为它看起来像一个字符串,或者{'foo': 45},因为它看起来像一个字典,这会让你在调试时感到困惑。

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

答案 3 :(得分: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