Zunächst scheint es, als ob Sie das Rad ein wenig neu erfinden ... die meisten Python-Web-Frameworks (CherryPy/TurboGears ist, was ich weiß) enthalten bereits eine Möglichkeit zum Senden von Anfragen an bestimmte Klassen basierend auf dem Inhalt der URL oder der Benutzereingabe.
Es gibt nichts falsch mit der Art, wie Sie es tun, wirklich, aber in meiner Erfahrung neigt dazu, eine Art "fehlende Abstraktion" in Ihrem Programm anzuzeigen. Sie verlassen sich im Grunde genommen auf den Python-Interpreter, um eine Liste der Objekte zu speichern, die Sie möglicherweise benötigen, anstatt sie selbst zu speichern.
So, als einen ersten Schritt, möchten Sie vielleicht nur ein Wörterbuch aller Klassen, die Sie vielleicht nennen wollen:
dispatch = {'Foo': Foo, 'Bar': Bar, 'Bizbaz': Bizbaz}
Zunächst wird dies nicht viel Unterschied machen. Aber wenn Ihre Webanwendung wächst, können Sie mehrere Vorteile finden: (a) Sie werden nicht in Namensraumkonflikte geraten, (b) unter Verwendung von globals()
können Sie Sicherheitsprobleme haben, wo ein Angreifer im Wesentlichen auf jedes globale Symbol in Ihrem Programm zugreifen kann wenn sie einen Weg finden können, um ein beliebiges classname
in Ihr Programm zu injizieren, (c) wenn Sie jemals wollen, dass classname
etwas anderes als der tatsächliche exakte Klassenname ist, ist die Verwendung Ihres eigenen Wörterbuchs flexibler, (d) Sie können das ersetzen dispatch
Wörterbuch mit einer flexibleren benutzerdefinierten Klasse, die Datenbankzugriff oder etwas ähnliches tut, wenn Sie die Notwendigkeit finden.
Die Sicherheitsprobleme sind besonders hervorstechend für eine Webanwendung. Doing globals()[variable]
wo variable
eingegeben wird von einem Webformular ist nur um Ärger zu bitten.