Objekte dynamisch ändern / 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
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Hi wieder einmal eine Frage, in dessen Materie ich mich nicht so recht auskenne.

Es geht darum nicht in den Kerncode eingreifen zu müssen, sondern herum mit plugins etwas zu
erweitern.

Ich habe eine Klasse, in meinem Fall drText, die vom wxpython stc (styled text control) ableitet. Nun möchte ich in einer Erweiterung diese drText eben erweitern oder ändern. zB die Funktion SetText möchte ich überladen und/oder neue zur Klasse hinzufügen (nicht zu jedem Objekt extra, da ja zu dieser Zeit schon mehrer existieren könnten)

1) Ist das möglich und wie? Mein Gefühl sagt mir schon dass das in Python geht.
2) muss ich das Ändern von Klassenmethoden vorher machen oder geht das auch noch zur Laufzeit, wenn Objekte dieser Klasse schon existieren?

(Bei einem Singleton ist das ja einfach. Da habe ich zb obj als Instance von drText. Nun sag
ich oldSeText = obj.SetText, obj.SetText=MyNewSetText und in MyNewSetText kann ich dann noch zusätzlich oldSetText() aufrufen, um die Grundsachen ausführen zu lassen. Hat das irgendwas mit @staticmethod und @classmethod zu tun?

Aber in meinem Fall ist das dann doch ein wenig anders.

Ah ja, kleine Zusatzfrage, nur aus Interesse.
3) Ist es möglich, zur Laufzeit herauszufinden, welche und wieviele Objekte (am besten in einer Liste) einer Klasses existieren?

(ich hoffe es ist alles so halbwegs verständlich, was ich meine, sonst einfach nochmals nachfragen)
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Da ich das Gefühl habe das so etwas eh schon öfters gefragt wurde, dann bitte darauf hinweisen. In Google habe ich noch vier Seiten gefunden (wahrscheinlich gibts viel mehr, die sich mit diesem oder änlichen "Problem" beschäftigen).

Ich werde sie mir mal morgen ansehen.

http://stackoverflow.com/questions/9629 ... at-runtime
http://stackoverflow.com/questions/1360 ... -in-python
http://jerryjcw.blogspot.com/2010/04/py ... class.html
http://irrepupavel.com/documents/python/instancemethod/
BlackJack

@Francesco: Klassen sind Objekte und (ungebundene) Methoden sind Attribute auf diesen Objekten.

Allerdings ist das ziemlich unsauber. Das ist okay wenn man irgendwas an Drittanbieter-Software reparieren muss ohne dass man an dem Quelltext was ändern kann oder will. Aber Du bist doch Entwickler bei dem Projekt. Da kannst Du also auch ordentliche Lösungen implementieren als da so dynamisch dran herumzuflicken.
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

BlackJack hat geschrieben:@Francesco: Klassen sind Objekte und (ungebundene) Methoden sind Attribute auf diesen Objekten.

Allerdings ist das ziemlich unsauber. Das ist okay wenn man irgendwas an Drittanbieter-Software reparieren muss ohne dass man an dem Quelltext was ändern kann oder will. Aber Du bist doch Entwickler bei dem Projekt. Da kannst Du also auch ordentliche Lösungen implementieren als da so dynamisch dran herumzuflicken.
Das ist schon richtig. Andererseits ist das auch irgendwie egoistisch, Sachen hineinzupacken, die ich einmal brauchen *könnte*, oder nur ich das momentan so will, und die andere User vielleicht gar nicht interessieren. Deswegen mein "defensiver" Ansatz. Dennoch hast du schon auch recht. Ist vielleicht dann eine Abwägungssache. Andererseits bin ich auch ein User mit eigenem Feature Request, warum sollte der dann weniger wert sein. :)

Ist ja nicht so, dass anderen die Funktionalität vorenthalten bleibt, wenn jmd. das möchte, da die plugins auch im svn miteingecheckt sind. Jeder kann sich das heraussuchen, was er möchte oder anhand der vorhandenen leicht selber eigene maßgeschneiderte erstellen.

Aber es gibt ja noch die Möglichkeit, ins Hauptprogramm an verschiedenen Stellen events zu posten, die dann in den jeweiligen Plugins abgefragt werden können und hier etwas geschehen kann. Ausserdem hat das mit dem Plugin den Vorteil, dass ich das selber einmal länger testen oder verwenden kann, ohne am bestehenden etwas zu ändern. Wollen das mehrere User, kann man das immer noch in den core zurückportieren (mit relativ wenig aufwand bzw. overhead, weil ja die Erstellung schon im Plugin gemacht wurde.

Darum mag ich auch Programme, bei denen ich das Menü ändern kann oder das context menü. Weil wenn ich irgendwelche Funktionen ein ganzes Jahr nciht braucht, warum soll ich die immer sehen. Aber da gibt es sicher auch Auffassungsunterschiede.
BlackJack

@Francesco: Wie sieht das eigentlich mit der Aktualität der Dokumentation aus? Da steht was von Python 2.3+ aber mit 2.5 läuft es nicht, weil ``with`` ohne den entsprechenden `__future__`-Import verwendet wird.

Nachdem ich den nachgetragen hatte, konnte ich einen wunderschönen Absturz provozieren -- und zwar einen richtigen "core dump" -- in dem ich die Autovervollständigung in der letzten Zeile einer Datei verwendet habe.

Sehe ich das richtig, dass man die Fensteraufteilung nicht in der Grösse ändern kann? Also ich meine zum Beispiel den "Splitter" zwischen Quelltext und Prompt verschieben.

Und der Widget-Inspektor liess sich zwar öffnen, aber nicht wieder schliessen!?

Und nun lässt sich die Anwendung nicht mehr starten. Ich bekomme diesen Traceback: http://paste.pocoo.org/show/247492/

(Aktuelle trunk-Version übrigens)
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

@Blackjack: Es ist heute schon spät und es sind sicher viele Schwachstellen drin. Es ist ohnehin eher ein Bastelprojekt, das eigentlich schon weit vom ursrünglichen Konzept (ein einfaches Programm) wegging.

Dokumentation wurde schon lange nicht mehr aktualisiert.

Die Spliterwindows kann man leider nicht ändern. War nie vorgesehen, wäre sicher aber schön. Man kann nur die Breite in den Sidepanels in den Preferences einstellen.

Ah das mit dem with (das war dein Codevorschlag, den ich einbaute). An ältere Versionen habe ich nicht gedacht. Ich weiß nicht, ob es sinnvoll ist, frühere Python Versionen immer mitzuschleppen. Vielleicht sollte man den Hinweis einfach ändern.

>in dem ich die Autovervollständigung in der letzten Zeile einer Datei verwendet habe.
Danke, das habe ich gerade nachstellen können. Habe ich soeben gefixt.

Der Widget Inspector: hast du das unter Linux oder Windows probiert?
BlackJack

@Francesco: Hm, ich bin ja immer noch aktiver Benutzer von Python 2.5. Soo alt finde ich das nicht. :-) Bin halt noch drauf angewiesen das zu unterstützen, weil ich noch Rechner habe wo ein "stabiles" Linux mit der Version drauf ist und Jython ist auch noch auf dem Stand und da muss ich auch Quelltexte für warten.

Den Widget-Inspektor habe ich unter Linux ausprobiert.
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

BlackJack hat geschrieben:@Francesco: Hm, ich bin ja immer noch aktiver Benutzer von Python 2.5. Soo alt finde ich das nicht. :-) Bin halt noch drauf angewiesen das zu unterstützen, weil ich noch Rechner habe wo ein "stabiles" Linux mit der Version drauf ist und Jython ist auch noch auf dem Stand und da muss ich auch Quelltexte für warten.

Den Widget-Inspektor habe ich unter Linux ausprobiert.
Ok. Natürlich nur, wenn dich das interessiert: Der widget instpector im wxPyhton Demo, dort funktioniert der schon? Eigentlich sinds ja gerade einmal zwei Zeilen, die den Aufruf (und das Menu halt dazu) ausmachen. Bei mir gehts (xubuntu)

Kopiert aus dem about dialog von drpy:

Code: Alles auswählen

wxPython Version: 2.8.10.1
wxPython Platform: wxGTK, unicode, gtk2, wx-assertions-off, SWIG-1.3.29
Python Version: 2.6.4.final
BlackJack

Mein Dialog sagt da:

Code: Alles auswählen

wxPython Version: 2.8.4.0
wxPython Platform: wxGTK, unicode, gtk2, wx-assertions-off, SWIG-1.3.29
Python Version: 2.5.1.final
Und in der wxPython-Demo kann ich den Inspektor problemlos schliessen. Eigenartig.
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

BlackJack hat geschrieben:Mein Dialog sagt da:

Code: Alles auswählen

wxPython Version: 2.8.4.0
wxPython Platform: wxGTK, unicode, gtk2, wx-assertions-off, SWIG-1.3.29
Python Version: 2.5.1.final
Und in der wxPython-Demo kann ich den Inspektor problemlos schliessen. Eigenartig.
ja eigenartig. ich werds mir in der todo liste vermerken.
BlackJack

@Francesco: Naja, so schlimm ist das ja nicht. Der Absturz bei der Autovervollständigung war beängstigender. :-)
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

BlackJack hat geschrieben:@Francesco: Naja, so schlimm ist das ja nicht. Der Absturz bei der Autovervollständigung war beängstigender. :-)
@BlackJack: Darf ich nochmals nachfragen. Meinst du das plugin CodeCompletion? Letzte Zeile? Was das eine neue leere Datei? War die schon als .py file gespeichert? Was hast du eingegeben? Oder meinst du die Funktion Edit=>Findandcomplete (Ctrl-Return)?
Ich freue mich sehr, dass du das ein bisschen probiert hast. Aber irgendwie werden wir hier zu dem Thema ein wenig offtopic. neuer Thread?
BlackJack

@Francesco: Plugins hatte ich noch gar nicht ausprobiert -- ich meine Ctrl+Enter. Keine leere Datei, denn man braucht Vorschläge für den Crash. Wenn ich einen Vorschlag mit Tab bestätige ist alles in Ordnung. Wenn ich ihn allerdings mit Enter bestätige, dann wird zusätzlich zum Einsetzen der Auswahl das darauf folgende Zeichen gelöscht. Ausser am Dokumentende, da versucht er dann anscheinend ein Zeichen "hinter" dem Dokument zu löschen und stürzt ab. Kann es sein, dass sich da die Er- bzw. Einsetzung mit der normalen Bedeutung der Eingabetaste irgendwie in die Quere kommen!?

Ein weiteres Problem dort ist übrigens, dass die Autocompletion-Funktion vom "STC" die Vorschläge alphabetisch sortiert erwartet. Die Sortierung nach Entfernung vom Cursor bringt den Algorithmus zur Anzeige/Aktualisierung der Vorschlagsliste durcheinander. Bei vielen Vorschlägen springt die Auswahl zu "komischen" Kandidaten und schliesst sich nach ein paar Buchstaben, obwohl immer noch gültige Vorschläge in der Liste waren. Die bekommt man durch erneutes Ctrl+Enter auch wieder angezeigt. Ich nehme mal an der STC-Code macht da intern eine binäre Suche und braucht die Vorschläge deshalb wirklich zwingend alphabetisch sortiert.
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Da hats ein Eck. Warum ich das nicht gesehen habe? Weil das projekt ist schon Jahre alt, und alle Sachen die mir nicht gepasst haben, habe ich mit eigenen Plugins überschrieben. So gesehen habe ich die Originalsachen schon länger nicht mehr getestet. Wie hier habe ich auch ein MyFindComplete. Wieder ein Bug! ;)

Nach langer Suche konnte ich das eingrenzen. Bei mir gings, nach dem das CodeCompletion plugin installiert ist und da wird für das AutoComplete etwas initialisiert. Ich hoffe, ich habe den Bug richtig gefixt. Wenn AutoComp gezeigt wird, muss der Return key extra behandelt werden.
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

So es sollte funktionieren. Schreckt mich immer wieder ein wenig, wenn jmd. das Programm zum ersten mal testet und gleich mehr als nur einen Fehler findet. ;)
Antworten