Az introspekció ( angol típusú introspekció ) a programozásban egy objektum típusának és szerkezetének lekérdezésének képessége futás közben. Az Objective C nyelvben azonban különösen fontos, hogy szinte minden olyan nyelven elérhető, amely lehetővé teszi az objektumtípusok első osztályú objektumaiként történő kezelését ; az önvizsgálatot támogató nyelvek a C++ ( RTTI -vel ), C# , Go , Java , Kotlin , JavaScript , Perl , Ruby , Smalltalk , PHPa Python introspekció pedig magába a nyelvbe van integrálva. Az introspekció felhasználható az ad-hoc polimorfizmus megvalósítására .
A C++ támogatja az önvizsgálatot a dinamikus típuskövetkeztetés ( RTTI ) typeid és dynamic_cast segítségével . Az operátor dynamic_casthasználható annak meghatározására, hogy egy objektum egy adott osztályhierarchiához tartozik-e. Például:
Személy * p = dinamikus_cast < Személy *> ( obj ); if ( p != nullptr ) { p -> séta (); }Az operátor typeidegy típusú objektumot kap, amely std::type_infoleírja a típust:
if ( typeid ( Person ) == typeid ( * obj )) { serialize_person ( obj ); }C#
if ( p személy ) _ { var peson = p as Person ; }A Java nyelven az önvizsgálati mechanizmust az instanceof[1] operátor segítségével valósítják meg . instanceofmeghatározza, hogy egy objektum egy adott osztályhoz, egy leszármazott osztályhoz tartozik-e, vagy egy objektum megvalósít egy adott interfészt. Például:
if ( Obj instanceof Person ){ Person p = ( Person ) obj ; o . séta (); }java.lang.ClassA [2] osztály jobb önvizsgálatot tesz lehetővé.
Például, ha meg kell határoznia egy objektum pontos típusát, használhatja a Object.getClass()vagy módszereket Class.getName():
Rendszer . ki . println ( obj.getClass ( ). getName ( ));A Pythonban az introspekció funkcionálisan megvalósítható a type() és dir() beépített metódusokkal vagy az inspect beépített modullal, vagy közvetlenül az objektumnévből származhat a __class__ és __dict__ beépített attribútumok használatával. Az introspekció használata Pythonban különösen kényelmes, köszönhetően annak a paradigmának, hogy "minden egy tárgy". Bármely entitás objektumként rendelkezik metaadatokkal (az objektumról szóló adatokkal), amelyeket attribútumoknak neveznek, és az entitáshoz társított funkcionalitást, úgynevezett metódusokat. A Pythonban az alapértelmezett új osztály maga a metaclass típusú objektum.
osztály MetaPerson ( típus ): def __repr__ ( cls ): return "Person" osztály Személy ( metaclass = MetaPerson ): def __init__ ( én , név , életkor , barátok = [] ): én . név = név én . kor = kor én . barátok = barátok def get_friends ( self ): return self . barátokEbből adódóan a Személy osztály introspekciója a következőképpen értelmezhető
>>> # Hozzon létre egy objektumot a korábban meghatározott osztályból Személy >>> ivan = Személy ( "Ivan" , 26 ) >>> type ( ivan ) < class ' Személy '> >>> típus ( Személy ) < class ' __main__ . MetaPerson '> >>> # lásd, hogy a Személy a MetaPerson metaosztály >>> típusú példánya ( getattr ( Személy , 'get_friends' )) < class ' function '> >>> isinstance ( ivan , Person ) IgazMinden objektumnak van egy __class__ attribútuma, amely a megfelelő metaosztály egy példányát adja vissza, és egy __dict__, amely az adott objektum összes attribútumának szótárát adja vissza. Az osztályon definiált metódusok a megfelelő metaosztály példány attribútumaivá válnak, így az osztálynév __dict__ meghívásával láthatók.
>>> iván . __class__ < class ' Személy '> >>> ivan . __dict__ { 'név' : 'Iván' , 'életkor' : 26 , 'barátok' : []} >>> { k : v . __class__ k , v esetén ivanban . _ __dikt__ . tételek ()} { 'név' : str , 'életkor' : int , 'barátok' : lista }