Introspecție (programare)

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită pe 17 septembrie 2019; verificările necesită 14 modificări .

Introspecția ( introspecția de tip engleză  ) în programare  este capacitatea de a interoga tipul și structura unui obiect în timpul execuției. Cu toate acestea, de o importanță deosebită în limbajul Objective C , este disponibil în aproape toate limbile care vă permit să manipulați tipurile de obiecte ca obiecte de primă clasă ; limbajele care acceptă introspecția sunt C++ (cu RTTI ), C# , Go , Java , Kotlin , JavaScript , Perl , Ruby , Smalltalk , PHP și Python au introspecția integrată în limbajul în sine. Introspecția poate fi folosită pentru a implementa polimorfismul ad-hoc .

Exemple

C++

C++ acceptă introspecția prin tipul de tip inferență dinamică ( RTTI ) typeid și dynamic_cast . Operatorul dynamic_castpoate fi folosit pentru a determina dacă un obiect aparține unei anumite ierarhii de clasă. De exemplu:

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

Operatorul typeidprimește un obiect de tip std::type_infocare descrie tipul:

if ( typeid ( Persoană ) == typeid ( * obj )) { serialize_person ( obj ); }

C#

dacă ( p este Persoană ) { var peson = p ca Persoană ; }

Java

În Java, mecanismul de introspecție este implementat folosind operatorul instanceof[1] . instanceofdetermină dacă un obiect aparține unei clase date, unei clase descendente sau dacă un obiect implementează o interfață dată. De exemplu:

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

Clasa java.lang.Class[2] permite accesul la o introspecție mai bună.

De exemplu, dacă trebuie să determinați tipul exact al unui obiect, puteți utiliza metodele Object.getClass()sau Class.getName():

Sistem . afară . println ( obj.getClass ( ). getName ( ));

Python

În Python, introspecția poate fi implementată funcțional folosind metodele încorporate type() și dir() sau modulul încorporat inspect, sau provine direct din numele obiectului folosind atributele încorporate __class__ și __dict__. Utilizarea introspecției în Python este deosebit de convenabilă, datorită paradigmei că „totul este un obiect”. Orice entitate, fiind un obiect, are metadate (date despre obiect), numite atribute, și funcționalitate asociată acestei entități, numite metode. În Python, noua clasă implicită este ea însăși un obiect de tipul metaclasă.

clasa MetaPerson ( tip ): def __repr__ ( cls ): return "Person" class Person ( metaclass = MetaPerson ): def __init__ ( self , name , age , friends = []): self . nume = nume de sine . varsta = age self . prieteni = prieteni def get_friends ( self ): return self . prieteni

Ca urmare, introspecția clasei Persoană poate fi interpretată după cum urmează

>>> # Creați un obiect din clasa definită anterior Person >>> ivan = Person ( "Ivan" , 26 ) >>> type ( ivan ) < class ' Person '> >>> type ( Person ) < class ' __main__ . MetaPerson '> >>> # vezi că Person este o instanță a metaclasei MetaPerson >>> tip ( getattr ( Person , 'get_friends' )) < class ' function '> >>> isinstance ( ivan , Person ) True

Orice obiect are un atribut __class__ care returnează o instanță a metaclasei corespunzătoare și __dict__ care returnează un dicționar al tuturor atributelor obiectului dat. Metodele definite pe o clasă devin atribute de instanță ale metaclasei corespunzătoare, astfel încât acestea pot fi văzute apelând __dict__ pe numele clasei.

>>> ivan . __clasa__ < clasa ' Persoana '> >>> ivan . __dict__ { 'nume' : 'Ivan' , 'vârsta' : 26 , 'prieteni' : []} >>> { k : v . __clasa__ pentru k , v în ivan . __dict__ . articole ()} { „nume” : str , „vârsta” : int , „prieteni” : listă }

Note

  1. Specificația limbajului Java: instanceof . Data accesului: 3 mai 2016. Arhivat din original pe 13 februarie 2012.
  2. API Java: java.lang.Class . Preluat la 3 mai 2016. Arhivat din original la 11 septembrie 2009.