¿Qué regla del lenguaje de Python permite que el descriptor se encuentre primero?
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.
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