Seite 1 von 1
Kann man in Python Objekten eine andere Klasse verpassen?
Verfasst: Sonntag 6. August 2017, 06:51
von Alfons Mittelmeyer
Ich habe Widgets, die einer Standard GUI Klasse angehören. Ich habe aber auch Klassen für solche Widgets mit erweiterten Eigenschaften. Bisher habe diese erweiterten Klassen verwendet. Nun kommt aber auch vor, dass ich auch Widgets nur mit den Standardeigenschaften habe. Und die möchte ich gerne in Widgets mit den erweiterten Eigenschaften umwandeln.
Schön wäre, wenn man das tun könnte ohne das ganze komplexe Innenleben auszulesen, die Widgets zu kopieren und die alten zu löschen. Wie bei einem Haus, das eine neue Fasssade bekommt, ohne dass man das ganze Haus abreißen muß, alle Möbel wegwerfen und alles neu machen muß.
Geht das?
Also, das Standardobjekt soll auch die Methoden des Extended Objektes bekommen. Aber das war es schon einmal nicht:
Code: Alles auswählen
class Standard:
pass
class Extended(Standard):
def info(self):
print(self)
extended_object = Extended()
print(extended_object.info())
standard_object = Standard()
standard_object.info = extended_object.info
print(standard_object.info())
Re: Kann man in Python Objekten eine andere Klasse verpassen?
Verfasst: Sonntag 6. August 2017, 11:35
von noisefloor
Hallo,
mir ist nicht klar, worauf du hinaus willst.
Das Beispiel macht jedenfalls keine Sinn - wenn die Klasse `Standard` die Attribute und Methoden von `Extended` haben soll, kannst du doch auch _direkt_ die Klasse `Extended` nehmen?!?
Oder willst nach im Nachhinein alle Instanzen, die von `Standard` existieren, auf `Extended` upgraden?
Gruß, noisefloor
Re: Kann man in Python Objekten eine andere Klasse verpassen?
Verfasst: Sonntag 6. August 2017, 14:27
von Astorek
Ich kenne hier eigentlich nur die Möglichkeit, bereits bei der Klassendefinition zu "tricksen" nach dem Motto:
Code: Alles auswählen
try:
import tkinter as tk
[...]
except [...]:
class tk(xyz):
[...]
Natürlich sehr unsauber und an dieser Stelle sollte man bloß nicht mit Kommentaren geizen, weshalb man es so gemacht hat wie hier... Aber es wäre eine Lösung^^.
Sowas ähnliches musste ich bei der Soundausgabe eines Projektes machen: Windows-Nutzer kriegten eine eigene Sound-Klasse, in der die Windows-Funktionen für die Ausgabe verantwortlich waren; Linux-User bekamen stattdessen eine (von den Methodendefinitionen her identische) andere Standard-Klasse vorgesetzt... (Gstreamer, was idR. sehr selten in Windows installiert ist...)
Re: Kann man in Python Objekten eine andere Klasse verpassen?
Verfasst: Sonntag 6. August 2017, 15:14
von BlackJack
@Astorek: Ich würde das nicht als sehr unsauber bezeichnen. Gerade bei Tkinter/tkinter ist das hier nicht ungewöhnlich wenn man damit Python 2 und 3 bedienen möchte:
Code: Alles auswählen
try:
import tkinter as tk
except ImportError:
import Tkinter as tk
Und manche Module gibt es mit der gleichen API in C oder in Python geschrieben und da sieht man dann auch manchmal so etwas wie:
Code: Alles auswählen
try:
import cStringIO as StringIO
except ImportError:
import StringIO
Oder beim Übergang von Python-Versionen ohne `json`-Modul zu welchen mit, war das hier oft zu sehen:
Code: Alles auswählen
try:
import json
except ImportError:
import simplejson as json
Und dann eine Weile in umgekehrter Reihenfolge weil `simplejson` schneller war als `json`.
Nicht über einen `ImportError` sondern über eine ``if``/``elif``-Kaskade über die Plattform wird so etwas ähnliches im `os`-Modul gemacht um `os.path` zur Verfügung zu stellen.
Re: Kann man in Python Objekten eine andere Klasse verpassen?
Verfasst: Sonntag 6. August 2017, 18:23
von Alfons Mittelmeyer
Mit tricksen über import ist leider nichts. Es geht darum, dass andere GuiBuilder tkinter Widgets erzeugen. In deren Source Code will ich nichts rumhantieren.
Ich aber habe erweiterte Klassen, nennt sich statt tkinter DynTkInter. Nur DynTkInter Widgets sind in DynTkInter und auch für meinen GuiDesigner sichtbar.
Ich habe jetzt eh schon fast die Konvertierung von tcl/tk Widgets nach DynTkInter fertig. Mit den tkinter Wiidgets mache ich es dann eben auch so. Ich lese alle tkinter Widgets aus in eine Datenstruktur. Dann lösche ich alle tkinter Widgets und erzeuge dann aus den Daten die DynTkInter Widgets.
Images können leider nicht übernommen werden, da sich aus dem Image Namen keine Verknüpfung mit dem File für das Image herstellen läßt. Die muss man eben manuell nachtragen.