2011-03-21 12 views
9
>>> class foo(object): 
...  def test(s): 
...   pass 
... 
>>> a=foo() 
>>> a.test is a.test 
False 
>>> print a.test 
<bound method foo.test of <__main__.foo object at 0x1962b90>> 
>>> print a.test 
<bound method foo.test of <__main__.foo object at 0x1962b90>> 
>>> hash(a.test) 
28808 
>>> hash(a.test) 
28808 
>>> id(a.test) 
27940656 
>>> id(a.test) 
27940656 
>>> b = a.test 
>>> b is b 
True 
+0

Lo siento, ¿qué? – Mat

Respuesta

7

Están vinculados en tiempo de ejecución; el acceso al atributo en el objeto vuelve a enlazar el método de nuevo cada vez. La razón por la que son diferentes cuando pones ambos en la misma línea es que el primer método no se ha liberado cuando el segundo está vinculado.

+8

Dicho de otra manera, el 'id' parece ser el mismo cada vez porque la instancia anterior se gc inmediatamente después de que se imprimió el resultado, y la administración de memoria en esa versión particular de CPython resulta lo suficientemente predecible para poner el siguiente objeto en el mismo lugar. – delnan

+0

Jaja, nunca se me ocurrió que el GC lo reubicaría en el mismo directorio. Gracias, todo esto tiene sentido. –

Cuestiones relacionadas