Metaprogramovanie v Pythone

Úvod

Realizácia techník metaprogramovania je silne ovplyvnená vlastnosťami programovacieho jazyka. Napríklad, jazyk Java má statickú typovú kontrolu a je prekladaný do bajtkódu. To obmedzuje možnosti dynamického upravovania štruktúry elementov programu počas behu.

Veľmi populárne sú však aj dynamické jazyky, ktoré nemajú fázu prekladu a kontrola typov sa vykonáva až počas behu. Python je jedným z jazykov tejto kategórie a preto ho využijeme na ukážku možnosti metaprogramovania v dynamických jazykoch.

Základy jazyka Python

Jazyk Python vznikol v roku 1990. Jeho autorom je Guido van Rossum. Ide o dynamický objektovo-orientovaný jazyk.

Python je interpretovaný jazyk. Napriek tomu, že tu nie je samostatný krok prekladu, pri spustení programu sa zdrojový kód automaticky prekladá do bajtkódu, ktorý je následne vykonávaný interpretátorom. Pre zrýchlenie opätovného spustenia sa bajtkód ukladá do súborov s príponou .pyc.

Kód v jazyku Python je rozdelený do samostatných súborov — modulov, ktoré sú usporiadané do adresárov — balíkov. V module môžu byť definované premenné, funkcie a triedy. V syntaxi sa využíva odsadzovanie na určenie vnorených blokov kódu.

Python je plne objektovo-orientovaný jazyk v ktorom objektmi nielen zložitejšie štruktúry, ale aj čísla alebo reťazce. Objektmi sú však aj funkcie, triedy a samotné moduly. Takže nielen dáta, ale aj samotný kód, tvoria dátový model jazyka Python.

Podstatnou vlastnosťou je to, že celý kód programu sa skladá z príkazov a príkazmi sú aj definície funkcií a tried. Pri prvom importe modulu sa vykonajú všetky definície a v tom momente sa vytvoria objekty funkcií a tried, a naviažu sa na mená, podobne ako sa hodnoty viažu na mená premenných pri ich inicializácii.

Introspekcia

Python ponúka širokú sadu zabudovaných funkcií pre introspekciu objektov, napríklad

  • vars() pre získanie zoznamu atribútov modulu, triedy, alebo iného objektu,
  • type() pre zistenie typu objektu,
  • isinstance() a issubclass() pre zistenie vzťahu medzi objektom a triedou, alebo medzi triedami,
  • hasattr(), getattr(), setattr() a delattr() pre manipuláciu s atribútmi objektov,
  • callable() pre zistenie, či objekt je možne zavolať ako funkciu.

Oveľa detailnejšie informácie je možné získať pomocou modulu inspect.

Okrem týchto funkcií je však možné pristupovať aj priamo k špeciálnym atribútom objektov. Tieto atribúty sprístupňujú detaily implementácie objektov. Napríklad inštancie tried majú atribút __class__ s referenciou na triedu a atribút __dict__, v ktorom sú uložené členské premenné.

Špeciálne metódy

TBD

Dekorátory

TBD

Metatriedy

TBD

Anotácie

TBD

Zdroje