Как вы получаете адрес экземпляра после переопределения метода __str__ в Python - PullRequest
2 голосов
/ 02 июня 2011
class Bar:
     pass

class Foo:
     def __str__(self): return "Foo instance"

>> aBar = Bar()
>> print aBar
<__main__.Bar instance at 0x100572a28>
>> aFoo = Foo()
>> print aFoo
Foo instance

есть ли способ распечатать адрес aFoo после переопределения метода str ?

с использованием

 >>repr(aFoo) 

решил мою проблему

1 Ответ

6 голосов
/ 02 июня 2011

По крайней мере, в cpython, id предоставляет адрес. Но вывод в десятичном виде; Вы должны преобразовать это в гекс:

>>> f = (x for x in [1,2,3])
>>> print f
<generator object <genexpr> at 0x1004d22d0>
>>> '%x' % id(f)
'1004d22d0'

На самом деле, однако, функция __repr__ не изменяется при переопределении __str__. Так что вы можете сделать это также:

>>> class Foo:
...     def __str__(self): return "Foo instance"
... 
>>> a = Foo()
>>> print a
Foo instance
>>> print repr(a)
<__main__.Foo instance at 0x1004d1c68>

Я думаю, id предпочтительнее для этого, если то, что вы хотите, это на самом деле id. Но id не гарантирует возвращение адреса; это просто реализация cpython. Я не знаю, указано ли, что встроенные __repr__ объектов должны возвращать адрес, или он должен возвращать id, или ни того, ни другого. Поэтому, если вы конкретно хотите, чтобы то, что дает __repr__, то это может быть путь.

Обновление : Ответ ни тот, ни другой, по крайней мере, в соответствии с языковой справкой , которая диктует только то, что __repr__ объекта будет "богатым информацией и однозначным". И действительно, иногда __repr__ на самом деле не возвращает адрес определенного объекта, как показано здесь:

>>> a = Foo()
>>> '%x' % id(a)
'1004d1fc8'
>>> '%x' % id(a.__str__)
'1004745a0'
>>> '%x' % id(Foo.__str__)
'1004745a0'
>>> repr(a.__str__)
'<bound method Foo.__str__ of <__main__.Foo instance at 0x1004d1fc8>>'
...