¿Qué regla del lenguaje de Python permite que el descriptor se encuentre primero?

StackOverflow https://stackoverflow.com/questions/1865902

  •  18-09-2019
  •  | 
  •  

Pregunta

Me topé con lo siguiente anoche y todavía estoy perdido en cuanto a explicarlo:

class Foo(object):
    @property
    def dave(self):
        vars(self)['dave'] = 1
        return 2

f = Foo()
print f.dave
print f.dave

Ejecutar este código produce:

2
2

La pregunta es ¿por qué? Mi comprensión del acceso a los atributos es que el diccionario de instancia se verifica antes del diccionario de clase, y el diccionario de cualquier base, sin embargo, como se ve por encima del diccionario de instancia, no parece ser revisado antes de que se encuentre el descriptor en el diccionario de clase.

¿Fue útil?

Solución

Mi comprensión del acceso a los atributos es que el diccionario de instancia se verifica antes del diccionario de clase y el diccionario de cualquier base

Los descriptores de datos son una excepción:

Por ejemplo, los enlaces, la precedencia de la invocación del descriptor depende de qué métodos descriptores se definen. Normalmente, los descriptores de datos definen ambos __get__() y __set__(), mientras que los descriptores no de datos tienen solo el __get__() método. Los descriptores de datos siempre anulan una redefinición en un diccionario de instancias. En contraste, los descriptores no de datos pueden ser anulados por instancias.

http://docs.python.org/reference/datamodel.html#invoking-descriptors

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top