Introspektion ( engelsk type introspection ) i programmering er evnen til at forespørge om typen og strukturen af et objekt under kørsel. Af særlig betydning i Objective C -sproget er det dog tilgængeligt på næsten alle sprog, der giver dig mulighed for at manipulere objekttyper som objekter af første klasse ; sprog, der understøtter introspektion, er C++ (med RTTI ), C# , Go , Java , Kotlin , JavaScript , Perl , Ruby , Smalltalk , PHPog Python -introspektion er integreret i selve sproget. Introspektion kan bruges til at implementere ad-hoc polymorfi .
C++ understøtter introspektion gennem dynamisk typeinferens ( RTTI ) typeid og dynamic_cast . Operatoren dynamic_castkan bruges til at bestemme, om et objekt tilhører et bestemt klassehierarki. For eksempel:
Person * p = dynamic_cast < Person *> ( obj ); if ( p != nullptr ) { p -> gå (); }Operatøren typeidmodtager et objekt af typen std::type_info, der beskriver typen:
if ( typeid ( Person ) == typeid ( * obj )) { serialize_person ( obj ); }C#
hvis ( p er person ) { var peson = p som Person ; }I Java implementeres introspektionsmekanismen ved hjælp af operatoren instanceof[1] . instanceofbestemmer, om et objekt tilhører en given klasse, en efterkommerklasse, eller om et objekt implementerer en given grænseflade. For eksempel:
if ( obj instanceof Person ){ Person p = ( Person ) obj ; p . gåtur (); }Klasse java.lang.Class[2] giver adgang til bedre introspektion.
For eksempel, hvis du har brug for at bestemme den nøjagtige type af et objekt, kan du bruge Object.getClass()eller metoderne Class.getName():
System . ud . println ( obj.getClass ( ). getName ( ));I Python kan introspektion implementeres funktionelt ved hjælp af type() og dir() indbyggede metoder eller inspect indbygget modul, eller komme direkte fra objektnavnet ved hjælp af __class__ og __dict__ indbyggede attributter. Det er særligt praktisk at bruge introspektion i Python, takket være paradigmet om, at "alt er et objekt". Enhver enhed, der er et objekt, har metadata (data om objektet), kaldet attributter og funktionalitet forbundet med denne enhed, kaldet metoder. I Python er den nye standardklasse i sig selv et objekt af typen metaclass.
klasse MetaPerson ( type ): def __repr__ ( cls ): returner "Person" klasse Person ( metaclass = MetaPerson ): def __init__ ( selv , navn , alder , venner = []): selv . navn = navn selv . alder = alder selv . venner = venner def get_friends ( selv ): returnere selv . vennerSom følge heraf kan introspektionen af Person-klassen fortolkes som følger
>>> # Opret et objekt af den tidligere definerede klasse Person >>> ivan = Person ( "Ivan" , 26 ) >>> type ( ivan ) < klasse ' Person '> >>> type ( Person ) < klasse ' __main__ . MetaPerson '> >>> # se, at Person er en instans af MetaPerson-metaklassen >>> - typen ( getattr ( Person , 'get_friends' )) < class ' function '> >>> isinstance ( ivan , Person ) TrueEthvert objekt har en attribut __class__, der returnerer en forekomst af den tilsvarende metaklasse og __dict__, der returnerer en ordbog over alle attributterne for det givne objekt. Metoder defineret på en klasse bliver forekomstattributter for den tilsvarende metaklasse, så de kan ses ved at kalde __dict__ på klassenavnet.
>>> ivan . __class__ < class ' Person '> >>> ivan . __dict__ { 'navn' : 'Ivan' , 'alder' : 26 , 'venner' : []} >>> { k : v . __klasse__ for k , v i ivan . __dikt__ . items ()} { 'navn' : str , 'alder' : int , 'venner' : liste }