2012-06-12 19 views
5

Este código produce una salida diferente en Python 2 y Python 3.Las descripciones de Python no funcionan en Python 2.7

class Descriptor(object): 
    def __get__(self, instance, owner): 
     print('read') 
     return 1 

    def __set__(self, instance, value): 
     print('write') 

    def __delete__(self, instance): 
     print('del') 

class C(): 
    a = Descriptor() 

c = C()         
c.a          
c.a = 3 
del c.a 
c.a 

print('finished') 

La salida para Python 2 es:

read 
read 
finished 

Para Python 3 es:

read 
write 
del 
read 
finished 

¿Por qué esta trabajando de esta manera? ¿En qué se diferencian las descripciones Python 2 de los descriptores Python 3?

Esto hace que también no tiene sentido, porque http://docs.python.org/release/3.0.1/reference/datamodel.html#invoking-descriptors describe con claridad exactamente lo mismo que http://docs.python.org/reference/datamodel.html#invoking-descriptors

(Estas son las documentaciones para Python 2.7 y Python 3.0.)

+0

(Por cierto, Python 3.0 y su documentación son obsoletas y se retiró, no utilizar Python 3.0 o 3.0.1 La documentación actuales se encuentran en http:. // docs. python.org/py3k/ y la versión actual es 3.2.3.) –

Respuesta

5

Edit: Como Ned Deily señala con precisión en los comentarios , el razón esto sucede es su clase C es una clase de estilo antiguo en Python 2, ya que no ha especificado object u otra clase de nuevo estilo como su clase base.


Porque en Python 2, va a crear una nueva instancia de atributo c.a cuando haces c.a = 3 que esconde el objeto descriptor situada en C.a.

c = C() 
c.a 
c.a = 3 
print c.__dict__['a'] 
print C.__dict__['a'] 
del c.a 
c.a 

da:

read 
3 
<__main__.Descriptor object at 0x04625570> 
read 
finished 
+1

Pero esto significaría que no podría usar los descriptores __set__ en Python 2. ¿Y por qué es esto diferente en Python 3? –

+9

Su clase C es una clase antigua en Python 2. Cámbiela a 'Clase C (objeto)' y Py 2 funciona igual que Py 3. –

+0

maldición! lo siento por incluso publicar esta pregunta. :-) Cambié 'Descriptor' a una nueva clase de estilo, pero no he visto que' C' no sea una nueva clase de estilo. Gracias Ned. –