metaclass programozás Python
Felülvizsgálata objektumorientált programozás
Kezdjük egy rövid áttekintést, hogy mi van a PFSZ. Az objektum-orientált programozási nyelvek, megadhatjuk osztályok. amelyek összekötik az összekapcsolt adatok és a viselkedést. Az osztályok öröklik egy részét vagy egészét a jellemzőit, a szülő osztály, de ők is meghatározhatják saját attribútumokat (adat) és módszerek (viselkedés). Végül osztályok általában szolgálnak sablonokat példányok létrehozása (más néven egyszerűen objektumok). Általános szabály, hogy a különféle esetekben az egyik osztály tartalmazza a különböző adatok, de mindannyian ugyanabban a formában - például mindkét tárgyak alkalmazottak Munkavállalói bob és Jane már bérek .salary és a helyiség .room_number. de az összeg a bérek és a szobaszámot különböznek.
További cikkek ebben a sorozatban
Néhány OOP nyelvek, köztük a Python, lehetővé váljon az objektumok befelé (más néven fényvisszaverő). Önelemző objektumok - képes leírni maguknak: milyen osztály tartozik ebben az esetben? Milyen szülő elemek ebben az osztályban? Milyen módszereket és attribútumok álló ingatlan? Betekintés lehetővé teszi egy függvény vagy módszer, amely kezeli a tárgyat, hogy a döntést annak alapján, amit a fajta objektum feldolgozása. Még nem önmagába funkciók gyakran ág alapján példány adatainak - például az elérési utat jane.room_number más módon bob.room_number. mert különböző helyiségekben. Az önvizsgálat, nyugodtan számítani a méret a prémium Jane. végrehajtása nélkül a számítás Bob. például azért, mert Jane .profit_share attribútummal. vagy azért, mert bob egy példánya alosztály Óránként (Alkalmazott).
válasz metaprogramozás
Az alapvető OOP rendszer, röviden a fent leírt, nagyon erős. Azonban a fenti leírásból látható, még egy pont: Python osztályok (és más nyelvek) maguk tárgyak átvihető és introspected. Mivel a tárgyak, mint említettük, segítségével létrehozott osztályok, amelyek a szokásos sablonok, sablonok jönnek létre egyes osztályok? A válasz nyilvánvaló - ez metaclasses.
Metaclasses Python mindig is. Azonban a mechanizmus megvalósítása metaclasses óta Python 2.2 verzió sokkal könnyebben elérhetővé váltak. Különösen kezdve 2.2-es verzió, Python már nem a nyelv csak egy speciális (többnyire rejtett) metaclass, amely alapján létrejött bármely objektum az osztály. Most a programozó létre alosztályok a gyökér metaclass típus, sőt dinamikusan generált osztályok különböző metaclasses. Természetesen az a tény, hogy meg lehet manipulálni metaclasses Python 2.2, ő nem magyarázza önmagában miért lehet, hogy keres.
Sőt, hogy saját osztályokat nem kell egyéni metaclasses. Egy kicsit érthetőbb koncepció egy osztály gyári. Normál funkció visszatér egy osztály, amelyet dinamikusan legújabb függvény törzsében. írhat a hagyományos szintaktikai Python:
Funkció class_with_method gyár () dinamikusan hozza létre, és visszaad egy osztály, amely módszerek és funkciók át a gyár. Mielőtt a class kerül vissza a függvény a néhány művelet vele. Az új modul által képviselt rövid írás, de ha nincs lehetőség a saját kódját a szervezetben az osztály gyárak, például:
Minden ilyen esetben (Foo. Foo2) viselkedését az osztály nem közvetlenül előírt a kódot, ahelyett, hogy létrehoz egy függvényhívás valós időben, dinamikusan érveket. Hangsúlyozni kell, hogy nem vagyunk dinamikusan létrehozni esetekben az osztályok. és az osztályok.
Metaclasses: megoldást keresnek a probléma?
Metaclasses - ez egy nagyon mély kérdés, ami nem is kell gondolni, hogy 99% -a felhasználók. Ha nem érti, hogy miért van szükség - így nem kell (emberek, hogy valóban szükség van, pontosan tudja, mi szükség van rájuk, és nem kell magyarázni - miért). - Tim Peters (Tim Peters), a Python guru
Methods (osztályok), valamint a hagyományos funkciókat visszatérhet objektumokat. Ezért bizonyos értelemben, akkor nyilvánvaló, hogy az osztály gyárak is olyan egyszerű, osztályok, akkor lehet funkciókat. Különösen Python 2.2 + végre egy különleges besorolású típusát. ami egy ilyen osztályú gyár. Természetesen az olvasók felidézni egy kevésbé ambiciózus funkció típus (). épült a régi verzió Python - szerencsére a viselkedését a régi funkció típus () Save the class típusú (más szóval, a típus (objektum) függvény a típusú / osztályú obj). Egy új osztályát típusú működik, mint egy osztály gyári, ugyanúgy, mint a funkció new.classobj.
Azonban, mivel most a típus - egy (meta) osztály, szabadok vagyunk alosztályba meg:
Mágikus módszer .__ új __ () és .__ init __ () van egy különleges karakter, de az elképzelés ugyanaz, mint bármely más osztály. .__ init __ () metódus lehetővé teszi, hogy konfigurálja a létrehozandó objektum; Eljárás .__ új __ () lehetővé teszi, hogy módosítsa a helyét. Az utóbbi természetesen nem használják túl gyakran, de lehetőség van minden osztályban, készül a stílus az új Python 2.2 (általában öröklődik, de nem helyettesíti).
A fiúk írja van egy funkció, amely különleges figyelmet igényel; megbotlik az egészet, aki először dolgozik metaclasses. Az első érv e módszerek általában úgynevezett CLS. és nem én. mert a módszerek ugyanis, hogy hozzon létre egy osztályt, és nem egy metaclass. Tény, hogy nincs semmi különös; minden módszer tulajdonítanak saját esetekben, és egy példány egy metaclass egy osztály. Egyértelművé teszi a helyzetet egy kicsit, nem külön neve:
Mindez meglepően hétköznapi mechanika kíséretében néhány szintaktikai kényelem, ami egyrészt megkönnyítik dolgozni metaclasses, és a többi - összekeverik az új felhasználók számára. Ez a szintaxis magában foglal több kiegészítő elemeket. Ugyanakkor az eljárás felbontása ezek a változások nagyon zavaros. Az osztályok öröklik metaclasses szüleiktől - vegye figyelembe, hogy ez nem ugyanaz, mint amelynek metaclasses a szülők (másik gyakori hiba). Régi-stílusú osztályok feladat globális változó _metaclass_ vezethet, hogy egy egyéni metaclass. Azonban a legtöbb esetben, és ez a legbiztonságosabb megközelítés az osztályban szeretne létrehozni a saját metaclass meghatározott attribútum osztály _metaclass_. Ezt a változót kell beállítani közvetlenül az osztály definíciója, mivel a metaclass nem használható, ha az attribútum később lesz telepítve (miután az osztály objektum létre kell hozni). Például:
Problémák megoldásához magic
Így megbeszéltük az alapötlet metaclasses. Ugyanakkor a használata metaclasses az igazi munka - meglehetősen kényes kérdés. A probléma a metaclasses az, hogy a normális szerkezet a PFSZ valójában osztályokba teszik nagyon kevés. osztály öröklési struktúrát hasznos a tokozás és csomagolás adatokat és módszereket, de általában a munka csak bizonyos esetekben.
Amint az várható, ez az alkalmazás kiírja meglehetősen általános leírása az adat objektum (a hagyományos példány objektum). Azonban, ha ez az alkalmazás valós időben osztómű, akkor kap egy egészen más eredmény:
Ebben a példában a sorszámozás gnosis.xml.pickle. de a legtöbb modern gnosis.magic csomag tartalmazza továbbá metaclass sorosító MetaYamlDump. MetaPyPickler és MetaPrettyPrint. Ezen túlmenően, a felhasználó „alkalmazások” dump.py alkalmazására lehet szükség semmiféle „MetaPickler” semmilyen Python csomagot, ahol az ilyen van szükség. Szöveg metaclass megfelelő erre a célra, a következő lesz:
Az egyik figyelemre méltó eredményeket a mechanizmus, hogy a programozó írásban kérelmet nem feltétlenül tudja, hogy mit szerializáció fogják használni, valamint arról, hogy lenne hozzá a sorszámozás, vagy valamilyen más határokon technológia a parancssorban.
Talán a leggyakoribb használata hasonló metaclasses segítségével MetaPicklers: adagolása, eltávolítása vagy helyettesítése meghatározott módszerek az osztályban létrehozott. Példánkban az „eredeti” Data.dump () metódus helyébe egy másik, kívül létrehozott alkalmazás időpontjában a Data osztály (és ezért minden további példány).
Más módon megoldani a problémákat a mágikus
Ha megpróbál létrehozni egy példányt a dolgozat osztály nem rendelkezik a szükséges komponensek egymásba ágyazott elemek leíró hibát jelez; ugyanez igaz az egyes al-elem. A jobb részelemek jön létre az egyszerűbb érveket, ha csak egy út egyértelmű „emelés” az érveket, hogy a megfelelő típusú.
Még annak ellenére, hogy a vizsgálati osztályok gyakran (informális) alapján a már meglévő DTD eset, ezen osztályok származnak magukat, mint a formátlan töredékek egy XML dokumentum, mint például:
Csomag gnosis.xml.validity semmit sem tud a DTD és a belső részét. Általában ezek a fogalmak és képességek metaclass DTDGenerator. változtatás nélkül gnosis.xml.validity és simple_diss.py. DTDGenerator nem helyettesíti a saját módszere .__ str __ () osztályba teremtette őket - akkor is kinyomtathatja a formátlan töredéke a XML - de ez metaclass segítségével könnyedén módosíthatja az ilyen mágikus eljárások.
Eszközök metaclasses
A gnosis.magic csomagban több segédprogramokat dolgozó metaclasses, valamint néhány példát metaclasses segítségével a aspektus-orientált programozás. A legfontosabb ilyen eszköz import_with_metaclass (). Ez a funkció használható a fenti példában, ez lehetővé teszi, hogy a behozatali harmadik féltől származó modult, de létre az összes modult osztályokat egyéni metaclass helyett típusát. Megadhatjuk az Ön által létrehozott (vagy akár venni máshonnan) metaclass minden új lehetőséget, hogy szeretne belépni egy harmadik fél modult. gnosis.magic tartalmaz több metaclasses dugó serialization; Más csomagok nyomjelző megőrzése tárgyak, hibanaplózásához stb
import_with_metclass () funkció szemlélteti számos előnye programozás metaclasses:
Egyik jellemzője ennek a funkciónak, hogy egy közönséges osztály Meta jön létre a megadott metaclass. Azonban, miután hozzátéve Meta mint szülő leszármazottai is létrehozott egy speciális metaclass. Lényegében, mint például a Meta osztályok rejthet metaclass készítője, és egy sor örökölhető módszerek - a két fél az ő örökségét függetlenek egymástól.