poo - ¿Cuál es el atributo python para obtener y establecer el orden?
llamar una clase dentro de otra clase python (2)
Descubrí esta gran publicación que tiene una explicación detallada sobre la búsqueda de atributos de objetos / clases.
Para la búsqueda de atributos de objetos:
Asumiendo que Class es la clase y la instancia es una instancia de Class, la evaluación de instance.foobar equivale aproximadamente a esto:
- Llame al tipo de ranura para Clase. getattribute (tp_getattro). El valor predeterminado hace esto:
- ¿Clase? dict tiene un elemento foobar que es un descriptor de datos?
- En caso afirmativo, devuelva el resultado de la clase. dict [''foobar'']. get (instancia, Clase).
- ¿Instancia? dict tiene un elemento foobar en él?
- Si es así, devuelve la instancia. dict [''foobar''].
- ¿Clase? dict tiene un elemento foobar que no es un descriptor de datos [9]?
- En caso afirmativo, devuelva el resultado de la clase. dict [''foobar'']. get (instancia, klass). [6]
- ¿Clase? dict tiene un elemento foobar que es un descriptor de datos?
- Si el atributo aún no se encontró, y hay una clase. getattr , llame a Class. getattr (''foobar'').
Hay una imagen ilustrada para esto:
Por favor, echa un vistazo al blog original si está interesado, lo que da una explicación destacada sobre la clase python, la búsqueda de atributos y la metaclase.
Python nos brinda muchas posibilidades en el atributo instancia / clase, por ejemplo:
class A(object):
def __init__(self):
self.foo = "hello"
a = A()
Hay muchas maneras de acceder / cambiar el valor de self.foo :
- acceso directo
a.foo - dict interno
a.__dict__[''foo''] - obtener y establecer
a.__get__ya.__set__, por supuesto que hay dos métodos predefinidos. - getattribute
a.__getattribute__ -
__getattr__y__setattr__ - quizás más.
Mientras leo el código fuente, siempre me pierdo de lo que es su orden de acceso definitiva. Cuando uso a.foo , ¿cómo sé qué método / atributo se llamará realmente?
bar = a.foo ...
- invoca
a.__getattribute__(''foo'') - que a su vez busca por defecto
a.__dict__[''foo''] - o invoca
foo''s.__get__()si se define enA
El valor devuelto se asignaría a la bar .
a.foo = bar ...
- invoca
a.__getattribute__(''foo'') - que a su vez busca por defecto
a.__dict__[''foo''] - o invoca
foo.__set__(bar)si se define en A.