Seite 1 von 1

Klassen erweitern ?

Verfasst: Donnerstag 18. November 2010, 12:41
von ravenheart
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 ^^

Re: Klassen erweitern ?

Verfasst: Donnerstag 18. November 2010, 12:49
von /me
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.

Re: Klassen erweitern ?

Verfasst: Donnerstag 18. November 2010, 13:42
von ravenheart
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?

Re: Klassen erweitern ?

Verfasst: Donnerstag 18. November 2010, 13:49
von ws
Hi ravenheart,

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

Gruss

Wolfgang

Re: Klassen erweitern ?

Verfasst: Donnerstag 18. November 2010, 13:50
von /me
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.

Re: Klassen erweitern ?

Verfasst: Donnerstag 18. November 2010, 13:52
von /me
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.

Re: Klassen erweitern ?

Verfasst: Donnerstag 18. November 2010, 13:54
von ravenheart
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 ^^

Re: Klassen erweitern ?

Verfasst: Donnerstag 18. November 2010, 14:11
von ravenheart
So...

was spricht gegen folgendes?

http://pastebin.com/1kwQydLw

Re: Klassen erweitern ?

Verfasst: Donnerstag 18. November 2010, 14:33
von Xynon1
Mal eine Frage nebenbei, mir scheint das was dir reichen würde wäre warscheinlich schon die build-in Funktion "setattr()", oder ?

Re: Klassen erweitern ?

Verfasst: Donnerstag 18. November 2010, 14:38
von ravenheart
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

Re: Klassen erweitern ?

Verfasst: Donnerstag 18. November 2010, 14:48
von Xynon1
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.

Re: Klassen erweitern ?

Verfasst: Donnerstag 18. November 2010, 14:50
von ravenheart
:roll:
Bitte mach mal ein Beispiel zum Bleistift

Re: Klassen erweitern ?

Verfasst: Donnerstag 18. November 2010, 14:54
von Xynon1
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())

Re: Klassen erweitern ?

Verfasst: Donnerstag 18. November 2010, 15:01
von EyDu
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.

Re: Klassen erweitern ?

Verfasst: Donnerstag 18. November 2010, 15:15
von ravenheart
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.

Re: Klassen erweitern ?

Verfasst: Donnerstag 18. November 2010, 15:29
von Xynon1
Also das klingt schon ziemlich kaputt,
ist es so schlimm den Nutzer deiner Klasse selbst entscheiden zu lassen welche Zusatz-Module er benötigt ?

Re: Klassen erweitern ?

Verfasst: Donnerstag 18. November 2010, 18:07
von bwbg
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