Вопрос-Ответ

How to print instances of a class using print()?

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

Когда я пытаюсь print создать экземпляр класса, я получаю вывод, подобный этому:

>>> class Test():
... def __init__(self):
... self.a = 'foo'
...
>>> print(Test())
<__main__.Test object at 0x7fc9a9e36d60>

Как я могу сделать так, чтобы print показывал что-то пользовательское (например, что-то, что включает в себя a значение атрибута)? То есть, как я могу определить, как экземпляры класса будут отображаться при печати (их строковое представление)?


Смотрите Как я могу выбрать пользовательское строковое представление для самого класса (не для экземпляров класса)? если вы хотите определить поведение для самого класса (в данном случае, чтобы print(Test) показывать что-то пользовательское, а не <class __main__.Test> или подобное). (Фактически, техника по сути та же, но сложнее в применении.)

Переведено автоматически
Ответ 1
>>> 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() функции (или когда вы просматриваете ее с помощью интерактивного приглашения).

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

Ответ 2

Как объясняет Крис Латц, это определяется __repr__ методом в вашем классе.

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


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


Учитывая следующий тест класса:

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

def __repr__(self):
return f"<Test a:{self.a} b:{self.b}>"

def __str__(self):
return f"From str method of Test: a is {self.a}, b is {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):
cls = self.__class__
return f"<{cls.__module_}.{cls.__qualname__} object at {id(self)}>"
Ответ 3

Если вы находитесь в ситуации, подобной @Keith, вы могли бы попробовать:

print(a.__dict__)

Это противоречит тому, что я бы счел хорошим стилем, но если вы просто пытаетесь отлаживать, то он должен делать то, что вы хотите.

Ответ 4

Общий способ, который может быть применен к любому классу без специального форматирования, может быть выполнен следующим образом:

class Element:
def __init__(self, name, symbol, number):
self.name = name
self.symbol = symbol
self.number = number

def __str__(self):
return str(self.__class__) + ": " + str(self.__dict__)

А затем,

elem = Element('my_name', 'some_symbol', 3)
print(elem)

производит

__main__.Element: {'symbol': 'some_symbol', 'name': 'my_name', 'number': 3}
python class