По крайней мере, в 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>>'