2013-08-16 5 views
7

Pythona 2.6.5 (R265: 79063, 1 października 2012, 22:07:21) [GCC 4.4.3]Dlaczego Id (I) w sposób niezwiązany Pythona 2 zmiany dla każdego dostępu

>>> class myclass: 
...  def func(self): 
...    pass 

>>> dd = myclass.func 
>>> ee = myclass.func 
>>> cc = myclass.func 
>>> ff = myclass.func 
>>> ss = myclass.func 
>>> uu = myclass.func 
>>> pp = myclass.func 
>>> 
>>> 
>>> id(dd) ; id(cc) ; id(ee) ; id(ff) ; id(ss) ; id(uu) ; id(pp) 
3074535252L 
3074534772L 
3074522444L 
3074531732L 
3074497588L 
3073003604L 
3073003724L 

Dlaczego identyfikator metody niezwiązanej jest inny za każdym razem?

Czy to nie to samo?

+0

Czy to samo dotyczy nowych klas stylów? – Tadeck

+0

@ Tadeck Pozwól mi teraz spróbować. EDYCJA: Tak, to prawda. – abc

+0

To, że id() jest adresem, jest nieistotnym szczegółem implementacji. Zaktualizowałem pytanie, aby to odzwierciedlić. –

Odpowiedz

6

Dzieje się tak dlatego, że metody na klasie (stare lub nowe) działają tak jak atrybuty z metodą deskryptora __get__; Na python 2, kod

foo = FooClass.bar_method 

jest analogiczna do

import types 
foo = types.MethodType(FooClass.__dict__['bar_method'], None, FooClass) 

Stworzy nową instancję instancemethod(bar_method, None, FooClass) na każdym wejściu. Oryginalna funkcja jest dostępna jako FooClass.bar_method.im_func i instancja klasy w foo.im_class. Typ dla metod związanych i niezwiązanych jest taki sam instancemethod; jeżeli człon im_self jest None instancja instancemethod ma repr <unbound method ...>, podczas gdy w przypadku im_self użytkownik nie jest określona, ​​reprezentujący jest <bound method...>

Python 3 jest inny. Metody niezwiązane mają repr <function x.f at 0x7fd419cf69e0>, a id jest zawsze taki sam, czyli są to tylko funkcje ogólne. W Pythonie 3 możesz przekazać cokolwiek dla self niezwiązanej, nieskorowanej metody, nawet None, jest to po prostu funkcja z kropką w nazwie.

+0

Nie dotyczy to metod związanych. Różne instancje wszystkich powiązanych metod mają ten sam obiekt funkcji. – abc

+0

Czy możesz to udowodnić za pomocą kodu? Bez dowodu (np. Dokumentacja lub działający kod) to tylko domysły. – Tadeck

+0

@ Tadeck, spróbowałem. Proszę, daj mu szansę. Użyłem atrybutu im_func, aby uzyskać obiekt func powiązany z różnymi instancjami związanymi metodami. – abc