2011-06-02 69 views
2
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 

重寫__str__方法後,有沒有辦法重寫STR方法後,打印出aFoo的地址?你如何獲得一個實例的地址在python

使用

>>repr(aFoo) 

解決我的問題

回答

6

至少在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>>' 
+0

.NET的對象沒有一個固定的地址,所以沒有辦法了IronPython的再版可包括一個地址:.Net垃圾回收會移動對象,這樣可用內存幾乎是連續的。我不確定Jython,但它可能是一樣的。 – Duncan 2011-06-02 20:43:54

+0

@Duncan,我也這麼想。沒有要測試的IronPython安裝,IronPython在默認'__repr__'方法中提供了什麼?它是否與'id'返回的值相同? – senderle 2011-06-02 21:53:25

+0

是的,它是'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