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.name
Obtener un atributo de una clase
Cuando utiliza la sintaxis
C.name
para hacer referencia a un atributo en un objeto de claseC
, la búsqueda continúa en dos pasos:Cuando el
name
es una clave enC.__dict__
,C.name
obtiene el valorv
deC.__dict__[''name'']
. Entonces, cuandov
es un descriptor (es decir, eltype(v)
suministra un método llamado__get__
), el valor deC.name
es el resultado deltype(v).__get__(v, None, C)
de llamadatype(v).__get__(v, None, C)
. Cuandov
no es un descriptor, el valor deC.name is v
.Cuando el
name
no es una clave enC.__dict__
,C.name
delega la búsqueda en las clases base deC
, lo que significa que se repite en las clases ancestrales deC
e 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.