使用继承编写__repr__函数的正确方法

时间:2017-06-03 08:43:53

标签: python oop inheritance repr

我正在尝试使用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))

或者如果在每个班级中覆盖该函数是一个好习惯。

另外,请忽略编码部分,因为我将其遗留下来。

2 个答案:

答案 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;何时使用类继承,只需重用超类中的代码。