是否有任何标准约定可以在 python 中打印对象。我知道如果我只是尝试打印对象,它将打印内存地址,但我想覆盖该方法并能够打印对象的人类可读格式以帮助调试。
人们是否遵循任何标准约定,或者它不是定义这种方法的好方法,而是有更好的选择?
是否有任何标准约定可以在 python 中打印对象。我知道如果我只是尝试打印对象,它将打印内存地址,但我想覆盖该方法并能够打印对象的人类可读格式以帮助调试。
人们是否遵循任何标准约定,或者它不是定义这种方法的好方法,而是有更好的选择?
您可以覆盖__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
__str__
在类中为您正在打印的对象 实现函数。
如果您要为无法更改的类打印对象,那么提供自己的print
函数相当简单,因为您使用的是 Python 3。
编辑:通常返回的字符串__str__
将特定于类,但至少足以识别对象。字符串的确切格式将根据类和公共属性而有所不同。
Edit2:这是一个描述国家/地区的类的简单(缩减)示例:
def __str__(self):
return "{0:<32} {1:>010}".
format(self.__name, self.__population)
如果您的对象可以以允许重新创建的方式表示,则覆盖该__repr__
函数。例如,如果您可以使用以下代码创建对象:
MyObject('foo', 45)
应该__repr__
返回。"MyObject('foo', 45)"
然后,您不需要实现__str__
.
但是如果对象太复杂以至于你不能那样表示它,那就重写吧__str__
。然后,您应该返回一些东西,既清楚地表明该对象不能被重新创建,并且它是一个对象。因此,不要 return "foo:45"
,因为它看起来像一个字符串,或者{'foo': 45}
因为它看起来像一个字典,这会让你在调试时感到困惑。
我建议您保留括号,例如<MyObject foo:45>
. 这样一来,很明显您一直在打印一个对象,而且很明显,这不仅仅是MyObject('foo', 45)
重新创建对象的写入问题,而是存储了更多数据。
打印有关对象(类实例)的自定义信息的标准方法是使用__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