Hallo,
momentan schlage ich mich mit der Metaklassenthematik ein wenig rum, leider hab ich noch nicht so ganz raus, wie es funktioniert... Jetzt habe ich gestern für ein Projekt ein bisschen mit SQLObject rumgespielt und dabei auf den Internetseiten gelesen, das SQLObject heftigst Gebrauch von Metaklassen macht. Da dachte ich mir... Prima! Guckst du dir mal an wie die das so gemacht haben das hilft sicher beim Verständnis... Leider nicht. Jetzt bin ich nämlich noch verwirrter als vorher.
Nach meinem Verständnis erzeugt man eine Metaklasse, indem man vom eingebauten type ableitet statt von object. Jetzt habe ich aber im SQLObject Sourcecode keine einzige Metaklasse gefunden??? Kann mir da jemand weiterhelfen? Hab ichs mal wieder nicht verstanden?
BTW, kennt jemand ne gute Resource für Metaklassen in Python abgesehen von den PEP's?
Dank schon mal an euch!
Sebastian
SQLObject und Metaklassen
Eine Metaklasse kann meines Wissens eine beliebige Funktion sein. Wenn eine Klasse erzeugt wird, die eine Metaklasse besitzt passiert folgendes:raist1314 hat geschrieben: Nach meinem Verständnis erzeugt man eine Metaklasse, indem man vom eingebauten type ableitet statt von object. Jetzt habe ich aber im SQLObject Sourcecode keine einzige Metaklasse gefunden??? Kann mir da jemand weiterhelfen? Hab ichs mal wieder nicht verstanden?
Code: Alles auswählen
class Test(object, A, B):
__metaclass__ = metaclass
def __init__ (self):
pass
Test = metaclass("Test", (object, A, B), {
'__init__': # die __init__ Funktion
})
Dass Test eine Klasse wird, dafür sorgt im allgemeinen type, deshalb wird eine Metaklasse normalerweise von type abgeleitet, da sonst keine Klasse dabei rauskommt.
Um die Verwendung von Metaklassen zu finden musst du weiter suchen:
* ist __metaclass__ in einer Klassendefinition, so wird diese verwendet
* wird __metaclass__ auf Modulebene definiert, sind alle Klassen in dem Modul von dieser Metaklasse
* Hat eine der Basisklassen eine Metaklasse, so wird diese verwendet
(evtl. kann die Reihenfolge auch anders sein)
Google ist dein Freund, einfach nach metaclass python suchen.BTW, kennt jemand ne gute Resource für Metaklassen in Python abgesehen von den PEP's?
Ansonsten:
http://python.liberty.ro/pycon/2005/pap ... bla_dp.pdf
Oder auch:
http://www-128.ibm.com/developerworks/l ... ymeta.html
Aber am besten ist sicher einfach mal damit rumspielen. Soetwas wie SQLObject mit Metaklassen umzusetzen ist eine gute idee, es aber daran zu lernen, könnte etwas schwer werden.
-
- User
- Beiträge: 52
- Registriert: Dienstag 21. September 2004, 06:58
- Wohnort: Adelzhausen
- Kontaktdaten:
Tjaaa... aber meines Wissens nach muss man von type ableiten, um eine Metaklasse zu definieren, also in etwa so:
Deine Ausführungen und dein Codebeispiel hab ich leider nicht so recht verstanden.
Übrigens will ich nicht SQLObject mittels Metaklassen implementieren, die Autoren schreiben, sie hätten heftigst dvon gebrauch gemacht, aber __metaclass__ oder etwas ähnliches kann ich im Sourcecode nicht finden... Korrektur... ich habs gefunden... Jaja, man sollte seine Werkzeuge schon richtig benutzen... Tschuldigung!
Gruss
Sebastian
Code: Alles auswählen
# meta klasse definieren
class MetaMaster(type):
def __new__(cls, classname, bases, classdict):
def __repr__(self):
return "TEST:%s" % classname
return type.__new__(cls, classname,bases,classdict)
# meta klasse in klasse master verwenden
class Master(object):
__metaclass__ = MetaMaster
Übrigens will ich nicht SQLObject mittels Metaklassen implementieren, die Autoren schreiben, sie hätten heftigst dvon gebrauch gemacht, aber __metaclass__ oder etwas ähnliches kann ich im Sourcecode nicht finden... Korrektur... ich habs gefunden... Jaja, man sollte seine Werkzeuge schon richtig benutzen... Tschuldigung!
Gruss
Sebastian
Ups, ja du hast recht. Man kann zwar auch eine Funktion definieren, diese wird nicht immer aufgerufen, wenn eine Klasse von einer Klasse ableitet die eine Metaklasse als Funktion besitzt.raist1314 hat geschrieben:Tjaaa... aber meines Wissens nach muss man von type ableiten, um eine Metaklasse zu definieren, also in etwa so:
...
Ich wollte darauf hinaus, dass eine Klassendefinitin in Python nichts anderes ist als ein Funktionsaufruf, wobei einfach eine neue type (oder Metaklassen) - Instanz erzeugt wird mit dem Namen, den Basisklassen und dem Dictionary als Argument. Du hast praktisch die Möglichkeit einzugreifen kurz bevor das Klasse-Objekt erzeugt wird.raist1314 hat geschrieben: Deine Ausführungen und dein Codebeispiel hab ich leider nicht so recht verstanden.
Ich hoffe ich meine Erklärung ist einigermasen verständlich

gruss
Johannes