Property zur Laufzeit generieren
Verfasst: Mittwoch 26. März 2008, 14:05
Hallo,
ich möchte in meiner Klasse die Property Objekte zur Laufzeit generieren. Hier der aktuelle Code, der eine übergebenes SQLObjekt durchläuft und aus seinen properties die meiner Klasse macht. Diese will ich dann teilweise in meiner Klasse überschreiben um bei den Settern einige Überprüfungen durchzuführen, bevor der Wert in die Datenbank kommt. Die anderen sollen durch die lambda Funktion gesperrt werden.
Problem ist nun das ich folgende Ausgabe bekomme
In wie weit geh ich das falsch an?
Danke für jede Hilfe!
ich möchte in meiner Klasse die Property Objekte zur Laufzeit generieren. Hier der aktuelle Code, der eine übergebenes SQLObjekt durchläuft und aus seinen properties die meiner Klasse macht. Diese will ich dann teilweise in meiner Klasse überschreiben um bei den Settern einige Überprüfungen durchzuführen, bevor der Wert in die Datenbank kommt. Die anderen sollen durch die lambda Funktion gesperrt werden.
Code: Alles auswählen
def GetSetterName(name):
return "_set_%s" % name
def GetGetterName(name):
return "_get_%s" % name
def GetPropertyName(name):
return name
class MyObjekt(object):
_obj = None #speichert das Resultat von get
_table = None
_name = None
def __init__(self,table,name):
self._table = table
self._name = name
#sqlobject durchlaufen
for name,item in table.__dict__.iteritems():
#fuer jedes property im sqlobject
#ein eigenes in dieser klasse schalten
if isinstance(item,property):
getter = lambda self,value: eval("self._obj.%s" % name)
setter = lambda self,value: False #Standard soll sein, den Setter fuer das SQLOBjekt zu verbieten, wo es erlaubt ist soll das property ueberschrieben werden
setattr(self, GetSetterName(name), setter)
setattr(self, GetGetterName(name), getter)
setattr(self, GetPropertyName(name), property(setter,getter))
class User(MyObject):
def __init__(self):
super(User, self).__init__(UserTable,"User")
Code: Alles auswählen
>>>a = User()
>>>a.get(1) #holt sich aus der Tabelle die spalte mit der ID 1, ist nicht im Code oben drin
>>>a.name
<property object at 0x833ad4c>
Danke für jede Hilfe!