Если вы хотите контролировать, как отображается экземпляр вашего класса, правильный путь сделать это, чтобы переопределить метод __format__
. В общем, три способа, которые можно переопределить используются для:
__repr__
- используется, когда необходимо объект, который будет отображаться в интерактивном интерпретаторе, как правило, помощь в отладке. Насколько это возможно, это должна быть строка, которая могла бы воссоздать объект, если он был оценен.
__str__
- используется, когда объект передается в str
или вызывается, когда print
пытается отобразить ваш объект. Без другого определения он просто вызывает __repr__
. Это строковое представление по умолчанию для экземпляра.
__format__
- используется, когда ваш объект является аргументом str.format
. Он получает в качестве дополнительного аргумента спецификацию формата (если есть), которая появляется после необязательного :
в поле замены.
Вот простой пример класса для представления пар чисел.Символ, используемый для разделения чисел, можно настроить с помощью спецификации формата.
class Pair():
def __init__(self, x, y):
self.x = x
self.y = y
def __format__(self, spec):
return "{}{}{}".format(self.x, spec, self.y)
def __str__(self):
return "{:/}".format(self)
def __repr__(self):
return "Pair({}, {})".format(self.x, self.y)
Он может быть использован как не следует:
>>> x = Pair(1,2)
>>> x # using __repr__
Pair(1, 2)
>>> str(x) # using __str__, with a default separator of/
'1/2'
>>> print(x) # uses __str__ implicitly
1/2
>>> "{}".format(x) # no separator specified
'12'
>>> "{:-}".format(x) # use - to separate the two numbers
'1-2'
... '__repr __()' не принимает * любые * аргументы ... –
И ваша функция должна возвращать строку, а не ничего , В init также нет никакого оператора возврата –
(хотя технически законно возвращать ничего или, по крайней мере, 'None', из' __init __() ') –