resueltos - poo python 3
¿Por qué son diferentes los procedimientos de búsqueda para obtener un atributo de una clase y de una instancia? (1)
Python in a Nutshell describe los procedimientos de búsqueda al obtener un atributo. El libro distingue dos casos
el procedimiento de búsqueda cuando se obtiene un atributo de una clase, por ejemplo,
cls.nameObtener un atributo de una clase
Cuando utiliza la sintaxis
C.namepara hacer referencia a un atributo en un objeto de claseC, la búsqueda continúa en dos pasos:Cuando el
namees una clave enC.__dict__,C.nameobtiene el valorvdeC.__dict__[''name'']. Entonces, cuandoves un descriptor (es decir, eltype(v)suministra un método llamado__get__), el valor deC.namees el resultado deltype(v).__get__(v, None, C)de llamadatype(v).__get__(v, None, C). Cuandovno es un descriptor, el valor deC.name is v.Cuando el
nameno es una clave enC.__dict__,C.namedelega la búsqueda en las clases base deC, lo que significa que se repite en las clases ancestrales deCe intenta la búsqueda de nombres en cada orden (en resolución de método, como se describe en " Orden de resolución de método "en la página 113).
el procedimiento de búsqueda cuando se obtiene un atributo de una instancia, por ejemplo,
obj.name
Dado que en Python 3, cada objeto de clase es realmente una instancia de su metaclase (por ejemplo, clase de type ), según el libro, ¿por qué el procedimiento de búsqueda para obtener un atributo de una clase y el procedimiento de búsqueda para obtener un atributo de una instancia diferente ?
No son diferentes, el libro simplemente está pasando por alto el concepto de metaclases aquí, ya que la mayoría de las clases son instancias del type base, que no tiene comportamientos especiales. Si tiene una metaclass que no sea el type , las reglas de búsqueda de instancia completa se aplican al buscar atributos en una clase (es solo que la clase de la clase es la metaclase).
Probablemente estaban tratando de evitar la complejidad de las metaclases desde el principio, eso es todo.