Introspekce ( anglicky introspection ) v programování je schopnost dotazovat se na typ a strukturu objektu za běhu. V jazyce Objective C je však obzvláště důležitý, je k dispozici téměř ve všech jazycích, které vám umožňují manipulovat s typy objektů jako s objekty první třídy ; jazyky, které podporují introspekci, jsou C++ (s RTTI ), C# , Go , Java , Kotlin , JavaScript , Perl , Ruby , Smalltalk , PHPa Pythonská introspekce je integrována do jazyka samotného. Introspekce může být použita k implementaci ad-hoc polymorfismu .
C++ podporuje introspekci prostřednictvím dynamického odvození typu ( RTTI ) typeid a dynamic_cast . Operátor dynamic_castlze použít k určení, zda objekt patří do určité hierarchie tříd. Například:
Osoba * p = dynamic_cast < Osoba *> ( obj ); if ( p != nullptr ) { p -> chodit (); }Operátor typeidobdrží objekt typu std::type_infopopisující typ:
if ( typeid ( Person ) == typeid ( * obj )) { serializovat_osoba ( obj ); }C#
if ( p je osoba ) { var peson = p jako Osoba ; }V Javě je mechanismus introspekce implementován pomocí operátoru instanceof[1] . instanceofurčuje, zda objekt patří do dané třídy, podřízené třídy nebo zda objekt implementuje dané rozhraní. Například:
if ( obj instanceof Osoba ){ Osoba p = ( Osoba ) obj ; p . chodit (); }Třída java.lang.Class[2] umožňuje přístup k lepší introspekci.
Pokud například potřebujete určit přesný typ objektu, můžete použít metody Object.getClass()nebo Class.getName():
Systém . ven . println ( obj.getClass ( ). getName ( ));V Pythonu lze introspekci funkčně implementovat pomocí vestavěných metod type() a dir() nebo vestavěného modulu inspect, nebo pocházet přímo z názvu objektu pomocí vestavěných atributů __class__ a __dict__. Použití introspekce v Pythonu je obzvláště pohodlné díky paradigmatu, že „všechno je objekt“. Jakákoli entita, která je objektem, má metadata (data o objektu), nazývaná atributy a funkce spojené s touto entitou, nazývané metody. V Pythonu je výchozí novou třídou objekt typu metaclass.
class MetaPerson ( type ): def __repr__ ( cls ): return "Person" class Osoba ( metaclass = MetaPerson ): def __init__ ( self , jméno , věk , přátelé = []): self . jméno = jméno sebe . věk = věk já . přátelé = přátelé def get_friends ( self ): return self . přáteléV důsledku toho lze introspekci třídy Osoba interpretovat následovně
>>> # Vytvořte objekt dříve definované třídy Osoba >>> ivan = Osoba ( "Ivan" , 26 ) >>> typ ( ivan ) < třída ' Osoba '> >>> typ ( Osoba ) < třída ' __main__ . MetaPerson '> >>> # vidět, že Osoba je instancí metatřídy MetaPerson >>> typu ( getattr ( Osoba , 'get_friends' )) < class ' function '> >>> isinstance ( ivan , Osoba ) TrueKaždý objekt má atribut __class__, který vrací instanci odpovídající metatřídy, a __dict__, který vrací slovník všech atributů daného objektu. Metody definované ve třídě se stanou atributy instance odpovídající metatřídy, takže je lze zobrazit voláním __dict__ u názvu třídy.
>>> Ivan . __class__ < class ' Osoba '> >>> ivan . __dict__ { 'jméno' : 'Ivan' , 'věk' : 26 , 'přátelé' : []} >>> { k : v . __třída__ pro k , v v ivan . __diktovat__ . položky ()} { 'jméno' : str , 'věk' : int , 'přátelé' : seznam }