Önvizsgálat (programozás)

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt közreműködők, és jelentősen eltérhet a 2019. szeptember 17-én felülvizsgált verziótól ; az ellenőrzések 14 szerkesztést igényelnek .

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 .

Példák

C++

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

Java

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

Python

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átok

Ebbő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 ) Igaz

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

Jegyzetek

  1. Java nyelvi specifikáció: instanceof . Hozzáférés dátuma: 2016. május 3. Az eredetiből archiválva : 2012. február 13.
  2. Java API: java.lang.Class . Letöltve: 2016. május 3. Az eredetiből archiválva : 2009. szeptember 11.