至少在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__
提供的東西,那麼這可能是一條可行的路。
更新:答案是既不,至少根據language reference,只決定了對象的__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>>'
.NET的對象沒有一個固定的地址,所以沒有辦法了IronPython的再版可包括一個地址:.Net垃圾回收會移動對象,這樣可用內存幾乎是連續的。我不確定Jython,但它可能是一樣的。 – Duncan 2011-06-02 20:43:54
@Duncan,我也這麼想。沒有要測試的IronPython安裝,IronPython在默認'__repr__'方法中提供了什麼?它是否與'id'返回的值相同? – senderle 2011-06-02 21:53:25
是的,它是'id()'返回的值,但只有在調用id()後纔會分配id,並且是一個簡單的遞增計數。例如,我創建了一個類的4個實例(a,b,c,d),然後以任意順序(d,b,c,a)打印它們的'repr()',並且這些id與我打印它們的順序相匹配:id(a),id(b),id(c),id(d)'給出'(48,46,47,45)'。 – Duncan 2011-06-03 08:40:50