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 .
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 ; }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 ( ));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 . amigosComo 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 ) TrueCualquier 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 }