Introspekce (programování)

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 17. září 2019; kontroly vyžadují 14 úprav .

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 .

Příklady

C++

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 ; }

Java

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 ( ));

Python

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 . 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 ) True

Kaž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 }

Poznámky

  1. Specifikace jazyka Java: instanceof . Datum přístupu: 3. května 2016. Archivováno z originálu 13. února 2012.
  2. Java API: java.lang.Class . Získáno 3. května 2016. Archivováno z originálu 11. září 2009.