Klassen erweitern ?

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
ravenheart
User
Beiträge: 70
Registriert: Mittwoch 10. November 2010, 18:41

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 ^^
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

ravenheart hat geschrieben:Ist sowas möglich? (Eine Art Plugin für Klassen)
Mit __metaclass__ geht da einiges.

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.
ravenheart
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?
ws
User
Beiträge: 65
Registriert: Freitag 16. Juni 2006, 13:19

Hi ravenheart,

hilfreich für Plugins für Klassen ist vielleicht das hier: http://martyalchin.com/2008/jan/10/simp ... framework/

Gruss

Wolfgang
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

ravenheart hat geschrieben:Kannst du ein Besipiel machen?
Ich habe es selber noch nie selbst umgesetzt. :K

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.
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

ws hat geschrieben:hilfreich für Plugins für Klassen ist vielleicht das hier: http://martyalchin.com/2008/jan/10/simp ... framework/
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.
ravenheart
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:

Code: Alles auswählen

import os
for file in os.listdir("."):     #lokale Suche
    if file == "a_addon.py":
        file = file[:-3]
        a = __import__(file)
Kann das zu argen Komplikationen führen?


Edit: funktioniert nicht so ganz ^^
ravenheart
User
Beiträge: 70
Registriert: Mittwoch 10. November 2010, 18:41

So...

was spricht gegen folgendes?

http://pastebin.com/1kwQydLw
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Mal eine Frage nebenbei, mir scheint das was dir reichen würde wäre warscheinlich schon die build-in Funktion "setattr()", oder ?
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
ravenheart
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
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

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.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
ravenheart
User
Beiträge: 70
Registriert: Mittwoch 10. November 2010, 18:41

:roll:
Bitte mach mal ein Beispiel zum Bleistift
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Zum Bleistift a.py

Code: Alles auswählen

class c(object):
    def __init__(self):
        pass
    def f(self):
        return "Hello World"

def g(self):
    return "Hello plugin"
b.py

Code: Alles auswählen

import a

if __name__ == "__main__":
    b = a.c()
    setattr(a.c, "g", a.g)
    print(b.g())
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
Das Leben ist wie ein Tennisball.
ravenheart
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.
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Also das klingt schon ziemlich kaputt,
ist es so schlimm den Nutzer deiner Klasse selbst entscheiden zu lassen welche Zusatz-Module er benötigt ?
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

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
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
Antworten