Introspección (programación)

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 17 de septiembre de 2019; las comprobaciones requieren 14 ediciones .

La introspección ( introspección de tipo inglés  ) en programación  es la capacidad de consultar el tipo y la estructura de un objeto en tiempo de ejecución. De particular importancia en el lenguaje Objective C , sin embargo, está disponible en casi todos los lenguajes que permiten manipular tipos de objetos como objetos de primera clase ; Los lenguajes que soportan la introspección son C++ (con RTTI ), C# , Go , Java , Kotlin , JavaScript , Perl , Ruby , Smalltalk , PHP y Python tienen la introspección integrada en el propio lenguaje. La introspección se puede utilizar para implementar polimorfismos ad-hoc .

Ejemplos

C++

C++ admite la introspección a través de la inferencia de tipos dinámicos ( RTTI ) typeid y dynamic_cast . El operador dynamic_castse puede utilizar para determinar si un objeto pertenece a una jerarquía de clases particular. Por ejemplo:

Persona * p = dynamic_cast < Persona *> ( obj ); if ( pag != punto nulo ) { p -> caminar (); }

El operador typeidrecibe un objeto de tipo std::type_infoque describe el tipo:

if ( typeid ( Persona ) == typeid ( * obj )) { serializar_persona ( obj ); }

C#

si ( p es Persona ) { var peson = p como Persona ; }

Java

En Java, el mecanismo de introspección se implementa mediante el operador instanceof[1] . instanceofdetermina si un objeto pertenece a una clase determinada, una clase descendiente o si un objeto implementa una interfaz determinada. Por ejemplo:

if ( obj instancia de Persona ){ Persona p = ( Persona ) obj ; pág . caminar (); }

La clase java.lang.Class[2] permite acceder a una mejor introspección.

Por ejemplo, si necesita determinar el tipo exacto de un objeto, puede usar los métodos Object.getClass()o Class.getName():

sistema _ fuera _ println ( obj.getClass ( ). getName ( ));

Pitón

En Python, la introspección se puede implementar funcionalmente usando los métodos integrados type() y dir() o el módulo integrado de inspección, o venir directamente del nombre del objeto usando los atributos integrados __class__ y __dict__. Usar la introspección en Python es especialmente conveniente, gracias al paradigma de que "todo es un objeto". Cualquier entidad, siendo un objeto, tiene metadatos (datos sobre el objeto), llamados atributos, y funcionalidades asociadas a esta entidad, llamadas métodos. En Python, la nueva clase predeterminada es en sí misma un objeto del tipo metaclase.

clase MetaPerson ( tipo ): def __repr__ ( cls ): devuelve "Persona" class Persona ( metaclase = MetaPerson ): def __init__ ( self , nombre , edad , amigos = []): self . nombre = nombre propio . edad = edad propia . amigos = amigos def get_friends ( self ): return self . amigos

Como resultado, la introspección de la clase Persona se puede interpretar de la siguiente manera

>>> # Crear un objeto de la clase previamente definida Persona >>> ivan = Persona ( "Ivan" , 26 ) >>> tipo ( ivan ) < clase ' Persona '> >>> tipo ( Persona ) < clase ' __principal__ . MetaPerson '> >>> # ver que Person es una instancia de la metaclase MetaPerson >>> type ( getattr ( Person , 'get_friends' )) < class ' function '> >>> isinstance ( ivan , Person ) True

Cualquier objeto tiene un atributo __class__ que devuelve una instancia de la metaclase correspondiente y __dict__ que devuelve un diccionario de todos los atributos del objeto dado. Los métodos definidos en una clase se convierten en atributos de instancia de la metaclase correspondiente, por lo que se pueden ver llamando a __dict__ en el nombre de la clase.

>>> Iván . __clase__ < clase ' Persona '> >>> ivan . __dict__ { 'nombre' : 'Ivan' , 'edad' : 26 , 'amigos' : []} >>> { k : v . __clase__ para k , v en ivan . __dict__ . items ()} { 'nombre' : str , 'edad' : int , 'amigos' : lista }

Notas

  1. Especificación del lenguaje Java: instancia de . Fecha de acceso: 3 de mayo de 2016. Archivado desde el original el 13 de febrero de 2012.
  2. API de Java: java.lang.Class . Consultado el 3 de mayo de 2016. Archivado desde el original el 11 de septiembre de 2009.