我正在尝试使用OOP python,我不确定__repr__
函数继承。由于父类函数看起来像这样:
def __repr__(self):
'''Returns representation of the object'''
return("{}({!r})".format("Class name", self._param))
我想知道是否更好地使用通用方法(也适用于儿童类),如下所示:
def __repr__(self):
'''Returns representation of the object'''
return("{}({!r})".format(self.__class__.__name__, self._param))
或者如果在每个班级中覆盖该函数是一个好习惯。
另外,请忽略编码部分,因为我将其遗留下来。
答案 0 :(得分:10)
__repr__
在Pythons数据模型中有特殊含义:
object.__repr__(self)
由
repr()
内置函数调用以计算对象的“官方”字符串表示形式。 如果可能的话,这应该看起来像一个有效的Python表达式,可用于重新创建具有相同值的对象(给定适当的环境)。如果无法做到这一点,则应返回<...some useful description...>
形式的字符串。返回值必须是字符串对象。如果一个类定义__repr__()
但不定义__str__()
,那么当需要该类的实例的“非正式”字符串表示时,也会使用__repr__()
。这通常用于调试,因此表示信息丰富且明确无误。
这意味着__repr__
返回的字符串应该可以用来创建另一个对象。所以__repr__
是经常需要覆盖的东西,不是因为__class__.__name__
而是因为&#34;状态&#34;必须在代表中捕获。
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))
然后,当您为__repr__
添加参数时,绝对应该覆盖__init__
:
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__
仍然准确&#34;描述&#34;那么子类就没有重载__repr__
:
class B(A):
pass
然而,使用self.__class__.__name__
而不是对类名进行硬编码总是一个不错的选择,以防您或其他人将其子类化。
答案 1 :(得分:1)
是 - - 它不仅仅是&#34; ok&#34;,但它几乎在每个项目和类层次结构中都更实用。
实际上,这几乎是一本完美的教科书示例&#34;何时使用类继承,只需重用超类中的代码。