SQLObject und Metaklassen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
raist1314
User
Beiträge: 52
Registriert: Dienstag 21. September 2004, 06:58
Wohnort: Adelzhausen
Kontaktdaten:

Dienstag 22. November 2005, 21:05

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
johannes
User
Beiträge: 8
Registriert: Sonntag 6. November 2005, 17:37
Wohnort: München

Dienstag 22. November 2005, 21:22

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?
Eine Metaklasse kann meines Wissens eine beliebige Funktion sein. Wenn eine Klasse erzeugt wird, die eine Metaklasse besitzt passiert folgendes:

Code: Alles auswählen

class Test(object, A, B):
 __metaclass__ = metaclass

 def __init__ (self):
  pass
# ==> wird zu: ==>

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)
BTW, kennt jemand ne gute Resource für Metaklassen in Python abgesehen von den PEP's?
Google ist dein Freund, einfach nach metaclass python suchen.

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.
raist1314
User
Beiträge: 52
Registriert: Dienstag 21. September 2004, 06:58
Wohnort: Adelzhausen
Kontaktdaten:

Dienstag 22. November 2005, 21:40

Tjaaa... aber meines Wissens nach muss man von type ableiten, um eine Metaklasse zu definieren, also in etwa so:

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
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
johannes
User
Beiträge: 8
Registriert: Sonntag 6. November 2005, 17:37
Wohnort: München

Dienstag 22. November 2005, 22:15

raist1314 hat geschrieben:Tjaaa... aber meines Wissens nach muss man von type ableiten, um eine Metaklasse zu definieren, also in etwa so:
...
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: Deine Ausführungen und dein Codebeispiel hab ich leider nicht so recht verstanden.
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.

Ich hoffe ich meine Erklärung ist einigermasen verständlich :-)

gruss
Johannes
Antworten