Ответ 1
Ну, __repr__
имеет особое значение в модели данных Pythons:
object.__repr__(self)
Вызывается встроенной функцией
repr()
для вычисления "официального" строкового представления объекта. Если это вообще возможно, это должно выглядеть как допустимое выражение Python, которое можно использовать для воссоздания объекта с тем же значением (с учетом соответствующей среды). Если это невозможно, должна быть возвращена строка вида<...some useful description...>
. Возвращаемое значение должно быть строковым объектом. Если класс определяет__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("{}('{}')".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("{}('{}')".format(self.__class__.__name__, self._param, self._param2))
Но в случае, если __repr__
суперкласса все еще точно "описывает" подкласс, тогда нет смысла перегружать __repr__
:
class B(A):
pass
Однако всегда лучше использовать self.__class__.__name__
жесткого кодирования имени класса, на тот случай, если вы или кто-то другой подклассирует его.