Introspektion (programmering)

Den aktuella versionen av sidan har ännu inte granskats av erfarna bidragsgivare och kan skilja sig väsentligt från versionen som granskades den 17 september 2019; kontroller kräver 14 redigeringar .

Introspektion ( engelsk  typ introspection ) i programmering  är möjligheten att fråga typen och strukturen för ett objekt vid körning. Av särskild betydelse i Objective C- språket är det dock tillgängligt på nästan alla språk som låter dig manipulera objekttyper som objekt av den första klassen ; Språk som stöder introspektion är C++ (med RTTI ), C# , Go , Java , Kotlin , JavaScript , Perl , Ruby , Smalltalk , PHP och Python har introspektion integrerat i själva språket. Introspektion kan användas för att implementera ad-hoc polymorfism .

Exempel

C++

C++ stöder introspektion genom dynamisk typinferens ( RTTI ) typeid och dynamic_cast . Operatorn dynamic_castkan användas för att avgöra om ett objekt tillhör en viss klasshierarki. Till exempel:

Person * p = dynamic_cast < Person *> ( obj ); if ( p != nullptr ) { p -> (); }

Operatören typeidfår ett objekt av typen som std::type_infobeskriver typen:

if ( typid ( Person ) == typid ( * obj )) { serialize_person ( obj ); }

C#

om ( p är person ) { var peson = p som person ; }

Java

I Java implementeras introspektionsmekanismen med operatorn instanceof[1] . instanceofbestämmer om ett objekt tillhör en given klass, en underklass, eller om ett objekt implementerar ett givet gränssnitt. Till exempel:

if ( obj instanceof Person ){ Person p = ( Person ) obj ; sid . (); }

Klass java.lang.Class[2] ger tillgång till bättre introspektion.

Om du till exempel behöver bestämma den exakta typen av ett objekt kan du använda metoderna Object.getClass()eller Class.getName():

System . ut . println ( obj.getClass ( ). getName ( ));

Python

I Python kan introspektion implementeras funktionellt med hjälp av de inbyggda metoderna type() och dir() eller den inbyggda modulen inspect, eller komma direkt från objektnamnet med de inbyggda attributen __class__ och __dict__. Att använda introspektion i Python är särskilt bekvämt, tack vare paradigmet att "allt är ett objekt". Varje entitet, som är ett objekt, har metadata (data om objektet), kallade attribut, och funktionalitet associerad med denna entitet, kallade metoder. I Python är den nya standardklassen i sig ett objekt av typen metaklass.

klass MetaPerson ( typ ): def __repr__ ( cls ): returnera "Person" klass Person ( metaklass = MetaPerson ): def __init__ ( själv , namn , ålder , vänner = []): själv . namn = namn själv . ålder = ålder jag . vänner = vänner def get_friends ( self ): returnera själv . vänner

Som ett resultat kan introspektionen av klassen Person tolkas på följande sätt

>>> # Skapa ett objekt av den tidigare definierade klassen Person >>> ivan = Person ( "Ivan" , 26 ) >>> typ ( ivan ) < class ' Person '> >>> typ ( Person ) < class ' __main__ . MetaPerson '> >>> # se att Person är en instans av MetaPerson-metaklass >>> - typen ( getattr ( Person , 'get_friends' )) < class ' function '> >>> isinstance ( ivan , Person ) True

Alla objekt har ett attribut __class__ som returnerar en instans av motsvarande metaklass och __dict__ som returnerar en ordbok med alla attribut för det givna objektet. Metoder som definieras på en klass blir instansattribut för motsvarande metaklass, så de kan ses genom att anropa __dict__ på klassnamnet.

>>> ivan . __class__ < class ' Person '> >>> ivan . __dict__ { 'namn' : 'Ivan' , 'ålder' : 26 , 'vänner' : []} >>> { k : v . __klass__ för k , v i ivan . __dikt__ . items ()} { 'namn' : str , 'ålder' : int , 'vänner' : lista }

Anteckningar

  1. Java-språkspecifikation: instans av . Tillträdesdatum: 3 maj 2016. Arkiverad från originalet 13 februari 2012.
  2. Java API: java.lang.Class . Hämtad 3 maj 2016. Arkiverad från originalet 11 september 2009.