2012-09-27 17 views
7

No puedo entender lo que hace la precedencia de abajo significa que en el contexto de __getattribute__() método especial y DescriptorsDescriptores: precedencia de acceso a través Atributo __getattribute() __

que leen esto bajo la topic("Precedence") - under topic ("Desriptors") del libro Core Python Programming 3 veces, todavía no puede pasar ... ¿Alguien puede explicar cuáles son estas precedencias y dónde se usan?

  • Atributos de clase
  • descriptores de datos
  • atribuye Instancia
  • descriptores no son de datos
  • Defaulting a __getattr__()

También leí la python documentation, donde me encontré con la siguiente declaración: -

Para enlaces de instancia, la precedencia de la invocación del descriptor depende de en los métodos de descriptores definidos. Un descriptor puede definir cualquier combinación de __get__(), __set__() y __delete__(). Si lo hace no define __get__(), entonces el acceso al atributo devolverá el objeto descriptor a menos que haya un valor en el diccionario de instancia del objeto. Si el descriptor define __set__() y/o __delete__(), es un descriptor de datos; si no define ninguno, es un descriptor que no es de datos. Normalmente, los descriptores de datos definen __get__() y __set__(), mientras que los descriptores que no son de datos solo tienen el método __get__() .

Los descriptores de datos con **__set__()** y **__get__()** definidos siempre anulan una redefinición en un diccionario de instancias. Por el contrario, los descriptores que no son de datos pueden anularse por instancias.

Los métodos de Python (incluidos staticmethod() y classmethod()) son implementados como descriptores no de datos. En consecuencia, las instancias pueden redefinir y anular métodos. Esto permite instancias individuales a adquirir comportamientos que difieren de otras instancias de la misma clase.

¿Alguien puede dar un pequeño ejemplo para explicar de qué se trata el first paragraph? ¿Qué significa decir "override a redefinition in an instance dictionary"?

+0

Relacionado: [¿Qué regla de lenguaje de Python permite encontrar el descriptor primero?] (Http://stackoverflow.com/questions/1865902/), [Descriptores y atributos proporcionados por python] (http://stackoverflow.com/questions/10536539 /) –

+0

@PiotrDobrogost .. Gracias Piotr por esos enlaces ... :) –

Respuesta

4

Suponga que tiene una clase:

class C(object): 
    dd = MyDataDescriptor() 
    ndd = MyNonDataDescriptor() 
    def __init__(self): 
     self.__value = 1 

Veamos primero en descriptores de datos. Si en el código que hace:

cobj = C() 
cobj.dd 

en consecuencia para el párrafo anterior, el objeto cobj.__dict__ habrá siempre overriden cuando se accede al atributo dd, es decir __get__/__set__/__del__ métodos del objeto descriptor siempre se utilizará en lugar de la diccionario.La única excepción se produce cuando el objeto descriptor no define un método __get__. Entonces, si hay una clave dd en el objeto cobj.__dict__, se leerá su valor, de lo contrario, se devolverá el objeto descriptor.

Ahora para los descriptores que no son de datos. Si en el código se llama:

cobj.ndd = 2 

continuación, los cueros cobj.__dict__ el descriptor no los datos y el atributo ndd siempre se lee desde el objeto cobj.__dict__. Así que si lo hace:

cobj.ndd 

no se llamará el método del descriptor __get__. Sin embargo, si se elimina el atributo del diccionario:

del cobj.ndd 

entonces el descriptor está de vuelta, así que llamar

cobj.ndd 

llamará al método __get__ en el descriptor.

+0

Muchas gracias Vicent, por una explicación tan agradable y elaborada ... Todas mis dudas están claras ahora ... Gracias de nuevo :) –

Cuestiones relacionadas