Hallo, ich hab hier eine Klasse geschrieben, welche Methoden für ein bestimmtes Dateiformat bietet.
Das ganze sei jetzt für Beispielzwecke die klasse A in einer a.py
Nun möchte ich, dass andere Leute meiner Klasse Funktionalität hinzufügen können, ohne meine Klasse A verändern zu müssen.
Weiterhin möchte ich aber eigentlich, dass
import a
allein genügt um meine Klasse mitsamt allen Extras verwenden zu können.
Ist sowas möglich? (Eine Art Plugin für Klassen)
Oder anders: was für Möglichkeiten habe ich denn?
Ich könnte zB Vererbung durchgehen lassen, so dass Benutzer neue Klassen , von meiner abgeleitet, erschaffen können und dieser dann neue Funktionalität zuweisen können.
Das hätte aber den Nachteil, dass meine Klasse nicht "mitwächst".
Ich hoffe dass ich mich halbwegs verständlich ausgedrückt habe ^^
Klassen erweitern ?
Mit __metaclass__ geht da einiges.ravenheart hat geschrieben:Ist sowas möglich? (Eine Art Plugin für Klassen)
Schau dir mal Customizing class creation und http://blog.tehansen.de/?p=90 an. Eine gute Beschreibung findest du auch im Buch "Pro Django (Expert's Voice in Web Development)" von Marty Alchin.
-
- User
- Beiträge: 70
- Registriert: Mittwoch 10. November 2010, 18:41
Boah.
Kann sein, dass ich jetzt nicht alles verstanden habe, aber beim Überfliegen hab ich bisher keine Möglichkeit gesehen, wie ich meinen Wunschtraum verwirklichen könnte.
Kannst du ein Besipiel machen?
Kann sein, dass ich jetzt nicht alles verstanden habe, aber beim Überfliegen hab ich bisher keine Möglichkeit gesehen, wie ich meinen Wunschtraum verwirklichen könnte.
Kannst du ein Besipiel machen?
Hi ravenheart,
hilfreich für Plugins für Klassen ist vielleicht das hier: http://martyalchin.com/2008/jan/10/simp ... framework/
Gruss
Wolfgang
hilfreich für Plugins für Klassen ist vielleicht das hier: http://martyalchin.com/2008/jan/10/simp ... framework/
Gruss
Wolfgang
Ich habe es selber noch nie selbst umgesetzt. :Kravenheart hat geschrieben:Kannst du ein Besipiel machen?
Wenn ich Zeit habe bastele ich noch was, aber das kann auch bis nächste Woche dauern. Vielleicht liefert jemand anders ja bis dahin etwas.
Das ist der gleiche Ansatz, den er im Pro Django-Buch verwendet. Man muss es wahrscheinlich mindestens dreimal lesen, aber schöner erklären kann ich es auch nicht.ws hat geschrieben:hilfreich für Plugins für Klassen ist vielleicht das hier: http://martyalchin.com/2008/jan/10/simp ... framework/
-
- User
- Beiträge: 70
- Registriert: Mittwoch 10. November 2010, 18:41
Was spricht eigentlich gegen diese Lösung:
Ich lasse Nutzer Extensions in Dateien mit bestimmten Namen schreiben.
zB zur Datei a.py müssen alle Extensions a_addon.py heißen und dann folgendes in a.py:
Kann das zu argen Komplikationen führen?
Edit: funktioniert nicht so ganz ^^
Ich lasse Nutzer Extensions in Dateien mit bestimmten Namen schreiben.
zB zur Datei a.py müssen alle Extensions a_addon.py heißen und dann folgendes in a.py:
Code: Alles auswählen
import os
for file in os.listdir("."): #lokale Suche
if file == "a_addon.py":
file = file[:-3]
a = __import__(file)
Edit: funktioniert nicht so ganz ^^
-
- User
- Beiträge: 70
- Registriert: Mittwoch 10. November 2010, 18:41
-
- User
- Beiträge: 70
- Registriert: Mittwoch 10. November 2010, 18:41
Hmm, wie kann er damit die Funktionen finden, welche ich hinzufügen möchte?
Im Idealfall möchte ich genau ein
import a
was dazu führt, dass alle Zusatzfunktionen mit eingebunden werden
Im Idealfall möchte ich genau ein
import a
was dazu führt, dass alle Zusatzfunktionen mit eingebunden werden
Du kannst doch in deinem Script dann einzeln festlegen, welche Attribute du der Klasse hinzufügen möchtetest.
Wenn ich mich irre, sag es mir,
doch man könnte doch alle "Plugin"-Funktionen in eine Datei schreiben diese und die Klasse importieren.
Dabei ganz normal getrennt lassen und dann in deinem Script festlegen welche Funktionen nun in deine Klasse reingesteckt werden soll.
Die restlichen Funktionen existieren zwar dann auch, aber nicht in der Klasse.
Wenn ich mich irre, sag es mir,
doch man könnte doch alle "Plugin"-Funktionen in eine Datei schreiben diese und die Klasse importieren.
Dabei ganz normal getrennt lassen und dann in deinem Script festlegen welche Funktionen nun in deine Klasse reingesteckt werden soll.
Die restlichen Funktionen existieren zwar dann auch, aber nicht in der Klasse.
-
- User
- Beiträge: 70
- Registriert: Mittwoch 10. November 2010, 18:41
Bitte mach mal ein Beispiel zum Bleistift
Zum Bleistift a.py
b.py
Code: Alles auswählen
class c(object):
def __init__(self):
pass
def f(self):
return "Hello World"
def g(self):
return "Hello plugin"
Code: Alles auswählen
import a
if __name__ == "__main__":
b = a.c()
setattr(a.c, "g", a.g)
print(b.g())
Hallo.
Möchtest du uns vielleicht verraten, was du eigentlich vor hast? Das sieht irgendwie nach einem XY-Problem aus. Dein aktueller Ansatz widerstrebt nämlich jedem vernünftigen Design.
Möchtest du uns vielleicht verraten, was du eigentlich vor hast? Das sieht irgendwie nach einem XY-Problem aus. Dein aktueller Ansatz widerstrebt nämlich jedem vernünftigen Design.
Das Leben ist wie ein Tennisball.
-
- User
- Beiträge: 70
- Registriert: Mittwoch 10. November 2010, 18:41
Mir kommen immer so komische Ideen ^^
Also ich hab eine Klasse welche einen bestimmten Dateityp behandeln kann.
Im Grunde handelt es sich dabei um ein modifiziertes csv-Format, an welchem ich ausnahmsweise nicht schuld bin.
Zunächst existierten zig Skripten in unterschiedlichsten Sprachen, welche immer einen kleinen Teil Funktionalität boten.
zb get_avg.py -column x
Das Problem hierbei war, dass man die Ergebnisse immer schwer weiter verarbeiten kann und alles aus der Standardausgabe wieder zurückbasteln darf.
Mein Ziel ist es, alle diese Skripen zu Python Funktionen zu verwurschteln.
Dabei ist eine Klasse entstanden, welche ziemlich viele Funktionen bereits bietet.
Nun sollte das ganze erweiterbar sein.
Früher hat man ein Skript einfach in den entsprechenden Ordner kopiert $PATH modifiziert und die Sache lief.
Ich möchte nun erreichen, dass sich meine Klasse auch erweitern kann.
Sprich: ich möchte, dass meine .py importiert wird, und damit meine Klasse und deren Funktionen zur Verfügung stehen.
Andere User sollen nun so einfach wie möglich diese Klasse um Methoden erweitern können, ohne dabei mein "Original" bearbeiten zu müssen wenn es geht.
Auch das Importieren von zig anderen .py sollte vermieden werden.
So bin ich auf die Idee gekommen, dass sich meine Klasse selbst erweitern könnte und suche nun nach Möglichkeiten genau das zu tun.
Also ich hab eine Klasse welche einen bestimmten Dateityp behandeln kann.
Im Grunde handelt es sich dabei um ein modifiziertes csv-Format, an welchem ich ausnahmsweise nicht schuld bin.
Zunächst existierten zig Skripten in unterschiedlichsten Sprachen, welche immer einen kleinen Teil Funktionalität boten.
zb get_avg.py -column x
Das Problem hierbei war, dass man die Ergebnisse immer schwer weiter verarbeiten kann und alles aus der Standardausgabe wieder zurückbasteln darf.
Mein Ziel ist es, alle diese Skripen zu Python Funktionen zu verwurschteln.
Dabei ist eine Klasse entstanden, welche ziemlich viele Funktionen bereits bietet.
Nun sollte das ganze erweiterbar sein.
Früher hat man ein Skript einfach in den entsprechenden Ordner kopiert $PATH modifiziert und die Sache lief.
Ich möchte nun erreichen, dass sich meine Klasse auch erweitern kann.
Sprich: ich möchte, dass meine .py importiert wird, und damit meine Klasse und deren Funktionen zur Verfügung stehen.
Andere User sollen nun so einfach wie möglich diese Klasse um Methoden erweitern können, ohne dabei mein "Original" bearbeiten zu müssen wenn es geht.
Auch das Importieren von zig anderen .py sollte vermieden werden.
So bin ich auf die Idee gekommen, dass sich meine Klasse selbst erweitern könnte und suche nun nach Möglichkeiten genau das zu tun.
Also das klingt schon ziemlich kaputt,
ist es so schlimm den Nutzer deiner Klasse selbst entscheiden zu lassen welche Zusatz-Module er benötigt ?
ist es so schlimm den Nutzer deiner Klasse selbst entscheiden zu lassen welche Zusatz-Module er benötigt ?
Ich werde das Gefühl nicht los, dass du hier Klassen als Namensraum missbrauchst. Klassen beschreiben etwas.
Nach deiner (sehr knappen) Beschreibung zu urteilen, eine Art Tabelle.
Klassen kann man durch Vererbung spezialisieren. Wenn B von A erbt, dann muss/sollte gelten: B ist ein A.
Wenn das Ziel sein, dass mehrere Programmieren an der Klasse rumbasteln können - im Sinne von erweitern - solltest du über eine Versionsverwaltung nachdenken
Zu viele Wenns. Mehr Input!
Grüße...
bwbg
Nach deiner (sehr knappen) Beschreibung zu urteilen, eine Art Tabelle.
Klassen kann man durch Vererbung spezialisieren. Wenn B von A erbt, dann muss/sollte gelten: B ist ein A.
Wenn das Ziel sein, dass mehrere Programmieren an der Klasse rumbasteln können - im Sinne von erweitern - solltest du über eine Versionsverwaltung nachdenken
Zu viele Wenns. Mehr Input!
Grüße...
bwbg
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"