Как распечатать экземпляры класса, используя print ()?

Я изучаю веревки в Python. Когда я пытаюсь напечатать объект класса Foobar с помощью функции print() , я получаю вывод, подобный этому:

<__main__.Foobar instance at 0x7ff2a18c>

Есть ли Как я могу установить поведение печати (или строковое представление ) класса и его объектов ? Например, когда я вызываю print() для объекта класса, я хотел бы напечатать его элементы данных в определенном формате. Как этого добиться в Python?

Если вы знакомы с классами C ++, то для стандарта ostream можно достичь выше, добавив friend ostream& operator << (ostream&, const Foobar&) метод для класса.

452
задан martineau 18 July 2019 в 16:26
поделиться

2 ответа

>>> class Test:
...     def __repr__(self):
...         return "Test()"
...     def __str__(self):
...         return "member of Test"
... 
>>> t = Test()
>>> t
Test()
>>> print(t)
member of Test

Метод __ str __ - это то, что происходит при его печати, а метод __ repr __ - это то, что происходит при использовании repr () (или когда вы смотрите на нее в интерактивной подсказке). Если это не самый Pythonic метод, прошу прощения, потому что я тоже все еще учусь, но он работает.

Если не указан метод __ str __ , Python будет печатать вместо этого результат __ repr __ . Если вы определите __ str __ , но не __ repr __ , Python будет использовать то, что вы видите выше, как __ repr __ , но по-прежнему будет использовать __ str __ для печати.

563
ответ дан 22 November 2019 в 22:43
поделиться

Как упомянул Крис Лутц , это определяется методом __ repr __ в вашем классе.

Из документации repr () ]:

Для многих типов эта функция пытается вернуть строку, которая даст объект с тем же значением при передаче в eval () , в противном случае представление представляет собой строку, заключенную в угловые скобки. который содержит имя типа объекта вместе с дополнительной информацией, часто включающей имя и адрес объекта. Класс может контролировать, что эта функция возвращает для своих экземпляров, определяя метод __ repr __ () .

Для следующего класса Test:

class Test:
    def __init__(self, a, b):
        self.a = a
        self.b = b

    def __repr__(self):
        return "<Test a:%s b:%s>" % (self.a, self.b)

    def __str__(self):
        return "From str method of Test: a is %s, b is %s" % (self.a, self.b)

.. он будет действовать в оболочке Python следующим образом:

>>> t = Test(123, 456)
>>> t
<Test a:123 b:456>
>>> print repr(t)
<Test a:123 b:456>
>>> print(t)
From str method of Test: a is 123, b is 456
>>> print(str(t))
From str method of Test: a is 123, b is 456

Если не определен метод __ str __ , print (t) (или print (str (t)) ) будет использовать результат __ repr __ вместо

Если нет __ repr __ , то используется метод по умолчанию, который в значительной степени эквивалентен ..

def __repr__(self):
    return "<%s instance at %s>" % (self.__class__.__name__, id(self))
123
ответ дан 22 November 2019 в 22:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: