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.