Так как метод __str__() переопределен, в админ панели будет выводиться непосредственно сам вопрос. Если бы метод не переопределялся, то там бы виднелось что-то вроде Question object (1). Дело в том, что в Django все модели наследуются от базового класса модели в модуле django.db.models, где метод __str__() определяется следующим образом:

```

def str(self): return "%s object (%s)" % (self.class.name, self.pk)

```

Таким образом, на печать выводится название класса, слово object и первичный ключ объекта в скобках.

Метод __repr__(). Прежде чем пускаться в объяснения работы метода __repr__(), разберёмся с тем, что же он делает. Для этого откроем терминал и зайдём в папку, где лежит наш файл с классом футбольного клуба, который мы создали ранее. Таким образом мы сможем получить доступ к классам и функциям нашего файла прямо из терминала:

```

$ ls football.py $ python >>> from football import FootballClub >>> club = FootballClub("Манчестер Юнайтед") >>> print(club) Манчестер Юнайтед >>>

```

Сначала мы импортируем класс FootballClub. Затем создаем объект этого класса, передав в него название клуба ("Манчестер Юнайтед”), и записываем его в переменную club. Далее выводим на печать содержимое этой самой переменной. Срабатывает метод __str__(), который мы создали, и мы видим название клуба. А что случится, если мы в терминале просто введем имя переменной, не передавая его предварительно в метод print()?

```

>>> club <football.FootballClub object at 0x10bdc8040>

```

На печать выводится название модуля, название класса, слово object и адрес ячейки, в которую он записан. Если вы хотите, чтобы в этот момент в терминале (или ином служебном окружении) выводилась другая информация, необходимо переопределить метод __repr__(). Но прежде чем бросаться это делать, прочитаем официальную документацию к этому методу:

“Если это возможно, вывод должен быть в виде выражения Python, которое можно использовать для воссоздания объекта с тем же значением (при условии наличия подходящего окружения). Если это невозможно, вывод должен быть в виде строки с текстом в таком формате <…полезная информация…>. Возвращаемое значение должно быть строкой Python.

Вывод метода обычно используется для дебаггинга, поэтому важно, чтобы он был информативным и недвусмысленным”.

Альтернативный вывод метода __repr__() должен помочь заново создать эквивалентный объект данного класса. Давайте добавим метод __repr__() в класс FootballClub:

```

class FootballClub:

def __init__(self, name, description=&quot;&quot;):
    self.name = name
    self.description = description

def describe_club(self):
    msg = f&quot;{self.name}: {self.description}&quot;
    print(msg)

def __str__(self):
    return self.name

def __repr__(self):
    if self.description:
        return (f&quot;FootballClub(name={self.name}, &quot;
                f&quot;description={self.description})&quot;)
    else:
        return f&quot;FootballClub(name={self.name})&quot;

```

Чтобы этот код сработал, надо заново открыть окно терминала и повторить весь порядок ввода:

```

$ python >>> from football import FootballClub >>> club = FootballClub("Манчестер Юнайтед") >>> club FootballClub("Манчестер Юнайтед")

```

На этот раз выводится не стандартная запись, а вывод нашего перезаписанного метода __repr__(): строка, позволяющая создать объект, полностью эквивалентный тому, в котором и был вызван метод __repr__().

repost

174

input message

напишите коммент

еще контент в этом сообществе

еще контент в этом соообществе

войдите, чтобы увидеть

и подписаться на интересных профи

в приложении больше возможностей

пока в веб-версии есть не всё — мы вовсю работаем над ней

сетка — cоциальная сеть для нетворкинга от hh.ru

пересекайтесь с теми, кто повлияет на ваш профессиональный путь