Иногда вам приходится иметь дело или представить строку байтов, например
bob2='bob\xf0\xa4\xad\xa2'
Если вы распечатаете это (в Ubuntu), вы получите
In [62]: print(bob2)
bob????
что не очень полезно для других, пытающихся понять вашу байтовую строку. В комментариях Джон указывает, что в Windows print(bob2)
приводит к чему-то вроде bobð¤¢
. Проблема в том, что Python определяет кодировку вашего терминала/консоли по умолчанию и пытается декодировать строку байтов в соответствии с этой кодировкой. Поскольку Ubuntu и Windows используют разные кодировки по умолчанию (возможно, utf-8
и cp1252
соответственно), получаются разные результаты.
Напротив, представление строки однозначно:
In [63]: print(repr(bob2))
'bob\xf0\xa4\xad\xa2'
Когда люди публикуют здесь на SO вопросы о строках Python, их часто просят показать представление строки, чтобы мы точно знали, с какой строкой они имеют дело.
В общем, repr должен быть однозначным строковым представлением объекта. repr(obj)
вызывает метод __repr__
объекта obj
. Так как в вашем примере класс A
не имеет своего метода __repr__
, repr(b)
прибегает к указанию класса и адреса памяти.
Вы можете переопределить метод __repr__
, чтобы предоставить более релевантную информацию.
В вашем примере '<__main__.A instance at 0x74d78>'
сообщает нам две полезные вещи:
- что
b
является экземпляром класса A
в пространстве имен __main__
,
- и что объект находится в памяти по адресу 0x74d78.
Например, у вас может быть два экземпляра класса A
. Если у них один и тот же адрес памяти, то вы знаете, что они «указывают» на один и тот же базовый объект. (Обратите внимание, что эту информацию можно также получить с помощью id
).
person
unutbu
schedule
11.01.2011