在Python的数据模型中,__repr__
有着特殊的意义:
object.__repr__(self)
repr()
内置函数通过调用此方法来计算对象的“官方”字符串表示形式。如果可能的话,这应该看起来像一个有效的Python表达式,可以在适当的环境中使用它重新创建具有相同值的对象。如果不可能,应返回一个类似于<...某些有用描述...>
的字符串。返回值必须是一个字符串对象。如果一个类定义了__repr__()
但没有定义__str__()
,那么在需要该类实例的“非正式”字符串表示时也会使用__repr__()
。
通常用于调试,因此表示应具有丰富的信息和无歧义性。
这意味着由__repr__
返回的字符串应该可用于创建另一个完全相同的对象。因此,__repr__
通常需要重写,不是因为__class__.__name__
,而是因为需要在表示中捕获“状态”。
class A(object):
def __init__(self, param):
self._param = param
def __repr__(self):
'''Returns representation of the object'''
return("{}({!r})".format(self.__class__.__name__, self._param))
如果您在__init__
中添加参数,那么绝对应该覆盖__repr__
:
class B(A):
def __init__(self, param1, param2):
self._param = param1
self._param2 = param2
def __repr__(self):
'''Returns representation of the object'''
return("{}({!r})".format(self.__class__.__name__, self._param, self._param2))
但是如果超类的__repr__
仍然准确地描述了子类,那么重载__repr__
就没有意义:
class B(A):
pass
然而,使用self.__class__.__name__
总是一个好的选择,而不是硬编码类名,以防您或其他人对其进行子类化。
_param
属性,那么它们从父类继承__repr__
是相当安全的。 - PM 2Ring