是否有任何标准约定在python中打印对象。我知道如果我只是尝试打印对象,它会打印内存地址,但我想覆盖该方法,并能够打印对象的可读格式以帮助调试。
有没有人遵循的标准惯例,或者它不是定义这种方法的好方法,而是有更好的选择?
答案 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