Handler je nach Klasse
Verfasst: Sonntag 1. September 2013, 16:25
Hallo,
ich möchte für ein kleines Pluginsystem verschiedene Handler für meine Programme ermöglichen. Ich habe eine Grundklasse, von der jede Klasse meines Programms (Product, Transaction, etc.) abgeleitet wird.
Diese ist im Konkreten so aufgebaut:
Die abgeleiteten Klassen werden dann ebenso von "Base" aus Sqlalchemy abgeleitet. Das Ganze funktioniert soweit ganz gut.
Nun habe ich aber das Problem, dass wenn ich zum Beispiel auf das abgeleitete "Transaction" mittels on einen Handler registriere, dieser für alle anderen Klassen ebenso registriert ist, nicht nur für Transaction. Nach meiner Auffassung müsste das ja dann nur in Transaction.actions abgespeichert werden, wird so nun aber in CPClass.actions hinterlegt.
Wo habe ich da meinen Denkfehler?
Vielen Dank.
ich möchte für ein kleines Pluginsystem verschiedene Handler für meine Programme ermöglichen. Ich habe eine Grundklasse, von der jede Klasse meines Programms (Product, Transaction, etc.) abgeleitet wird.
Diese ist im Konkreten so aufgebaut:
Code: Alles auswählen
class CPClass(object):
id = None
actions = {"init": []}
@reconstructor
def __init__(self,**kwargs):
for key,value in kwargs.iteritems():
setattr(self,key,value)
@hybrid_method
def search(cls,condition=None,**kwargs):
if condition:
return session.query(cls).filter(condition)
else:
return session.query(cls).filter_by(**kwargs)
@hybrid_method
def search_one(cls,condition=None,**kwargs):
return cls.search(condition=condition,**kwargs).one()
@classmethod
def on(cls,action,handler):
try:
cls.actions[action].append(handler)
except KeyError:
cls.actions[action] = list()
cls.actions[action].append(handler)
Nun habe ich aber das Problem, dass wenn ich zum Beispiel auf das abgeleitete "Transaction" mittels on einen Handler registriere, dieser für alle anderen Klassen ebenso registriert ist, nicht nur für Transaction. Nach meiner Auffassung müsste das ja dann nur in Transaction.actions abgespeichert werden, wird so nun aber in CPClass.actions hinterlegt.
Wo habe ich da meinen Denkfehler?
Vielen Dank.