2013-08-16 10 views
7

Python 2.6.5 (R265: 79063, 1 ottobre 2012, 22:07:21) [GCC 4.4.3]Perché id() di un metodo non legato in Python 2 cambiamento per ogni accesso

>>> 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 

Perché l'ID del metodo non associato è diverso ogni volta?

Non dovrebbe essere lo stesso?

+0

Succede lo stesso con le nuove classi di stile? – Tadeck

+0

@Tadeck Lasciami provare ora. EDIT: Sì, lo fa. – abc

+0

Che id() è l'indirizzo è un dettaglio di implementazione irrilevante. Ho aggiornato la domanda per riflettere questo. –

risposta

6

Questo perché i metodi su una classe (vecchia o nuova) funzionano davvero come attributi con il metodo descrittore __get__; Sulla pitone 2 codice

foo = FooClass.bar_method 

è analogo a

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

Si creerà una nuova istanza di instancemethod(bar_method, None, FooClass) ogni accesso. La funzione originale è disponibile come FooClass.bar_method.im_func e l'istanza della classe in foo.im_class. Il tipo per entrambi i metodi rilegati e non associati è lo stesso instancemethod; se il membro im_self è None, l'istanza instancemethod ha repr <unbound method ...>, mentre se im_self membro non è None, repr è <bound method...>

Python 3 è differente. I metodi non associati hanno un repr <function x.f at 0x7fd419cf69e0> e l'id è sempre lo stesso, cioè sono solo funzioni generali. In Python 3 è possibile passare qualsiasi cosa per self di un metodo non decorato non legato, anche None, è solo una funzione con un punto nel suo nome.

+0

Ciò non accade per i metodi associati. Diverse istanze di metodi associati hanno tutti lo stesso oggetto funzione. – abc

+0

Puoi provarlo con il codice? Senza prove (ad esempio documentazione o codice di lavoro) è solo una supposizione. – Tadeck

+0

@Tadeck, l'ho provato. Per favore, vai avanti e dagli un colpo. Ho usato l'attributo im_func per ottenere l'oggetto func associato alle diverse istanze del metodo associato. – abc

Problemi correlati