una poo otra metodos llamar instanciar instancia dentro como clases clase __init__ python class attributes metaprogramming instance-variables

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]
  • 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 :

  1. acceso directo a.foo
  2. dict interno a.__dict__[''foo'']
  3. obtener y establecer a.__get__ y a.__set__ , por supuesto que hay dos métodos predefinidos.
  4. getattribute a.__getattribute__
  5. __getattr__ y __setattr__
  6. 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 ...

  1. invoca a.__getattribute__(''foo'')
  2. que a su vez busca por defecto a.__dict__[''foo'']
  3. o invoca foo ''s .__get__() si se define en A

El valor devuelto se asignaría a la bar .

a.foo = bar ...

  1. invoca a.__getattribute__(''foo'')
  2. que a su vez busca por defecto a.__dict__[''foo'']
  3. o invoca foo .__set__(bar) si se define en A.