Abhängigkeit zwischen abgeleiteter Klasse und Basisklasse
Hallo, kurze Beschreibung: Ich habe in wxPython eine Klasse z. B. "LogDiagramm" geschrieben die mir Messwerte aus einer Logdatei als Diagramm in einem Dialog darstellt. Zur Interaktion befindet sich auf dem Dialog nur ein "Close" Button und eine Checkbox um die automtische Skalierung ein bzw. abzuschalten. Zur Anzeige der aktuell gemessenen Messwerte habe ich eine zweite Klasse z. B. "OnlineDiagramm" geschrieben die von der Klasse "LogDiagramm" erbt. Da in der abgeleiteten Klasse die Daten und die Diagrammachsen etwas anders Dargestellt werden wurden lediglich die Funktionen drawAxis() und drawData() in dieser Klasse neu geschrieben. Somit nutzt eine Instanz der abgeleiteten Klasse alle Funktionen der Basisklasse bis eben auf diese Beiden. Auf eine dedizierte Initialisierung der abgeleiteten Klasse wurde ebenfalls verzichtet, womit die Funktion __init__() der Basisklasse ausgeführt wird. Nun zu meinem Problem: Bringe ich beide Diagrammdialoge zur Anzeige und klicke in die "Enable Autoscaling" Checkbox so wirkt sich die Aktion auf beide Diagramme aus. Dies wundert mich etwas da ich der Meinung war dass die entsprechenden Funktionen und Variablen nach den jeweiligen erzeugen einer Instanz eben nur in jener bekannt sind. Vermutlich mache ich hierbei einen Denkfehler bin aber noch nicht auf die entsprechende Lösung gestoßen. Ich würde mich sehr freuen wenn mir jemand einen Tipp geben könnte der mir auf die Sprünge hilft. Schon jetzt recht herzlichen Dank Viele Grüße Frank -- Bevor Sie diese E-Mail ausdrucken, überlegen Sie bitte, ob dies wirklich erforderlich ist. Please think before you print. -- WIKA Alexander Wiegand SE & Co. KG Alexander-Wiegand-Straße 30 - 63911 Klingenberg - Germany Kommanditgesellschaft: Sitz Klingenberg - Amtsgericht Aschaffenburg HRA 1819 Komplementärin: WIKA Verwaltungs SE & Co. KG - Sitz Klingenberg - Amtsgericht Aschaffenburg HRA 4685 Komplementärin: WIKA International SE - Sitz Klingenberg - Amtsgericht Aschaffenburg HRB 10505 Vorstand: Alexander Wiegand Vorsitzender des Aufsichtsrats: Dr. Max Egli Telefon: (09372) 132-0 Internet: www.wika.com -- The information contained in this E-Mail and any attached files are strictly confidential and may be subject to legal privilege. If you are not the intended recipient, his representative or the person responsible for delivering the message to the intended recipient, be advised that you have received this message in error and that any dissemination, copying or use of this message or attachment is strictly forbidden, as is the disclosure of the information therein. If you have received this E-Mail in error, please notify us immediately by E-Mail or telephone and delete this message and all its attachments subsequently. All reasonable precautions have been taken to ensure no viruses are present in this E-Mail.
From: "Wagner, Frank" <F.Wagner@wika.de> Date: Mon, 2 Apr 2012 14:27:18 +0000 To: "python-de@python.net" <python-de@python.net> Subject: [Python-de] Abhängigkeit zwischen abgeleiteter Klasse und Basisklasse
Hallo,
kurze Beschreibung: Ich habe in wxPython eine Klasse z. B. „LogDiagramm“ geschrieben die mir Messwerte aus einer Logdatei als Diagramm in einem Dialog darstellt. Zur Interaktion befindet sich auf dem Dialog nur ein „Close“ Button und eine Checkbox um die automtische Skalierung ein bzw. abzuschalten.
Zur Anzeige der aktuell gemessenen Messwerte habe ich eine zweite Klasse z. B. „OnlineDiagramm“ geschrieben die von der Klasse „LogDiagramm“ erbt. Da in der abgeleiteten Klasse die Daten und die Diagrammachsen etwas anders Dargestellt werden wurden lediglich die Funktionen drawAxis() und drawData() in dieser Klasse neu geschrieben. Somit nutzt eine Instanz der abgeleiteten Klasse alle Funktionen der Basisklasse bis eben auf diese Beiden. Auf eine dedizierte Initialisierung der abgeleiteten Klasse wurde ebenfalls verzichtet, womit die Funktion __init__() der Basisklasse ausgeführt wird.
Nun zu meinem Problem: Bringe ich beide Diagrammdialoge zur Anzeige und klicke in die „Enable Autoscaling“ Checkbox so wirkt sich die Aktion auf beide Diagramme aus. Dies wundert mich etwas da ich der Meinung war dass die entsprechenden Funktionen und Variablen nach den jeweiligen erzeugen einer Instanz eben nur in jener bekannt sind.
Vermutlich mache ich hierbei einen Denkfehler bin aber noch nicht auf die entsprechende Lösung gestoßen. Ich würde mich sehr freuen wenn mir jemand einen Tipp geben könnte der mir auf die Sprünge hilft.
Schon jetzt recht herzlichen Dank
Ohne deinen Code zu sehen muesste ich jetzt meine Glaskugel aus dem Keller holen, polieren, feststellen, dass sie einen Sprung hat, zu G.T.U. Gehen (Glaskugel Teile Unger), sie reparieren lassen, und dann koennte ich dir die Antwort verraten. Alternativ schickst du einfach mal deinen Code rum, per Anhang oder vielleicht sogar besser noch als pastebin. Diez
Wagner, Frank wrote:
kurze Beschreibung: Ich habe in wxPython eine Klasse z. B. "LogDiagramm" geschrieben die mir Messwerte aus einer Logdatei als Diagramm in einem Dialog darstellt. Zur Interaktion befindet sich auf dem Dialog nur ein "Close" Button und eine Checkbox um die automtische Skalierung ein bzw. abzuschalten.
Zur Anzeige der aktuell gemessenen Messwerte habe ich eine zweite Klasse z. B. "OnlineDiagramm" geschrieben die von der Klasse "LogDiagramm" erbt. Da in der abgeleiteten Klasse die Daten und die Diagrammachsen etwas anders Dargestellt werden wurden lediglich die Funktionen drawAxis() und drawData() in dieser Klasse neu geschrieben. Somit nutzt eine Instanz der abgeleiteten Klasse alle Funktionen der Basisklasse bis eben auf diese Beiden. Auf eine dedizierte Initialisierung der abgeleiteten Klasse wurde ebenfalls verzichtet, womit die Funktion __init__() der Basisklasse ausgeführt wird.
Nun zu meinem Problem: Bringe ich beide Diagrammdialoge zur Anzeige und klicke in die "Enable Autoscaling" Checkbox so wirkt sich die Aktion auf beide Diagramme aus. Dies wundert mich etwas da ich der Meinung war dass die entsprechenden Funktionen und Variablen nach den jeweiligen erzeugen einer Instanz eben nur in jener bekannt sind.
Vermutlich mache ich hierbei einen Denkfehler bin aber noch nicht auf die entsprechende Lösung gestoßen. Ich würde mich sehr freuen wenn mir jemand einen Tipp geben könnte der mir auf die Sprünge hilft.
Nur zur Erinnerung: class A: checkboxstate = CBS() class B(A): pass Hier ist checkboxstate ein Attribut der Klasse A und wird von allen Instanzen einschließlich derer der abgeleiteten Klasse B geteilt. Damit jede Instanz ihren eigenen checkboxstate erhält, muss der Code so angepasst werden: class A: def __init__(self): self.checkboxstate = CBS() class B(A): pass Das wars nicht? Show us the code...
Wagner, Frank wrote:
Ich hab mir schon gedacht, dass es ohne Code nicht so richtig gehen wird. Das Versenden des Codes ist mir allerdings eigentlich nicht gestattet.
Der übliche Ausweg ist es, analogen Code zu veröffentlichen, der das Problem aufweist, aber nichts über den eigentlichen Kontext verrät. Ich habe vor kurzem einen Verweis auf eine gute Zusammenfassung (englisch) gesehen: http://sscce.org/
Da ich aber nun den Thread gestartet habe und diesen nicht weiter verfolgen würde wäre das ja alles um sonst gewesen. Aus diesem Grund habe ich mich entschlossen ihnen die beiden Klassendefinitionen hier anzuhängen. Allerdings werde ich ihnen dies nur als pm schicken und nicht an die komplette Liste.
class A: def __init__(self): self.checkboxstate = CBS()
class B(A): pass
Dies entspricht im Prinzip meiner Umsetzung.
Nicht ganz, eher
class A: ... def __init__(self, cbs): ... self.checkboxstate = cbs ... class B(A): ... pass ... cbs = {} a = A(cbs) b = B(cbs) a.checkboxstate["on"] = True b.checkboxstate {'on': True}
I hoffe, du bekommst keinen Ärger, wenn ich einen Schnipsel hier zitiere: class DiagramDialog(wx.Dialog): def __init__(self, parent, id, title, style_map, ...): ... self.stylemap = style_map ... self.Bind(wx.EVT_CHECKBOX, self.onClickENautoscale, self.en_autoscale_cb) def onClickENautoscale(self, event): self.stylemap["en_autoscale"] = self.en_autoscale_cb.GetValue() ... Du lieferst den entsprechenden Code nicht mit, aber ich vermute, dass du beide Dialoge mit dem selben style_map dict initialisierst. In diesem Fall wäre ein einfacher Fix self.stylemap = style_map zu ersetzen durch self.stylemap = dict(style_map)
Hallo Vielen Dank für die rasche Antwort
Der übliche Ausweg ist es, analogen Code zu veröffentlichen, der das Problem aufweist, aber nichts über den eigentlichen Kontext verrät.
Ich habe vor kurzem einen Verweis auf eine gute Zusammenfassung (englisch) gesehen: http://sscce.org/
Vielen Dank das werde ich mir mal ansehen.
Du lieferst den entsprechenden Code nicht mit, aber ich vermute, dass du beide Dialoge mit dem selben style_map dict initialisierst. In diesem Fall wäre ein einfacher Fix
self.stylemap = style_map
zu ersetzen durch
self.stylemap = dict(style_map)
Ja Du vermutest richtig allerdings ist mir der Unterschied dieser beiden Codezeilen nicht ganz klar. Die zweite Zeile sieht für mich aus wie ein Typecast. Wo liegt der Unterschied im Ergebnis wird im zweiten Fall ein Slicing durchgefürht? Viele Grüße Frank Wagner -- Bevor Sie diese E-Mail ausdrucken, überlegen Sie bitte, ob dies wirklich erforderlich ist. Please think before you print. -- WIKA Alexander Wiegand SE & Co. KG Alexander-Wiegand-Straße 30 - 63911 Klingenberg - Germany Kommanditgesellschaft: Sitz Klingenberg - Amtsgericht Aschaffenburg HRA 1819 Komplementärin: WIKA Verwaltungs SE & Co. KG - Sitz Klingenberg - Amtsgericht Aschaffenburg HRA 4685 Komplementärin: WIKA International SE - Sitz Klingenberg - Amtsgericht Aschaffenburg HRB 10505 Vorstand: Alexander Wiegand Vorsitzender des Aufsichtsrats: Dr. Max Egli Telefon: (09372) 132-0 Internet: www.wika.com -- The information contained in this E-Mail and any attached files are strictly confidential and may be subject to legal privilege. If you are not the intended recipient, his representative or the person responsible for delivering the message to the intended recipient, be advised that you have received this message in error and that any dissemination, copying or use of this message or attachment is strictly forbidden, as is the disclosure of the information therein. If you have received this E-Mail in error, please notify us immediately by E-Mail or telephone and delete this message and all its attachments subsequently. All reasonable precautions have been taken to ensure no viruses are present in this E-Mail.
On 4/3/12 12:50 PM, "Wagner, Frank" <F.Wagner@wika.de> wrote:
Hallo
Vielen Dank für die rasche Antwort
Der übliche Ausweg ist es, analogen Code zu veröffentlichen, der das Problem aufweist, aber nichts über den eigentlichen Kontext verrät.
Ich habe vor kurzem einen Verweis auf eine gute Zusammenfassung (englisch) gesehen: http://sscce.org/
Vielen Dank das werde ich mir mal ansehen.
Du lieferst den entsprechenden Code nicht mit, aber ich vermute, dass du beide Dialoge mit dem selben style_map dict initialisierst. In diesem Fall wäre ein einfacher Fix
self.stylemap = style_map
zu ersetzen durch
self.stylemap = dict(style_map)
Ja Du vermutest richtig allerdings ist mir der Unterschied dieser beiden Codezeilen nicht ganz klar. Die zweite Zeile sieht für mich aus wie ein Typecast. Wo liegt der Unterschied im Ergebnis wird im zweiten Fall ein Slicing durchgefürht?
Ein bisschen suchen in der Doku oder einfach mal ausprobieren im Interpreter haette weniger Zeit gekostet als diese Mail zu schreiben... Was die Zeile macht ist eine oberflaechliche Kopie des dictionaries zu erstellen - und dadurch teilen sich die zwei Instanzen nicht mehr den Zustand, sondern haben jeweils ihren eigenen. Diez
Wagner, Frank wrote:
self.stylemap = style_map
zu ersetzen durch
self.stylemap = dict(style_map)
Ja Du vermutest richtig allerdings ist mir der Unterschied dieser beiden Codezeilen nicht ganz klar. Die zweite Zeile sieht für mich aus wie ein Typecast.
Python is not C.
Wo liegt der Unterschied im Ergebnis wird im zweiten Fall ein Slicing durchgefürht?
dict(some_dict) erstellt eine flache ("shallow") Kopie mit den gleichen Daten. Diese enthält anfänglich die gleichen Daten, Updates gehen jedoch nur in das neue dict. Vorher:
a = {"x": 1} b = a # beide Namen verweisen auf dasselbe Objekt assert a is b b["y"] = 2 a {'y': 2, 'x': 1}
Nachher:
a = {"x": 1} b = dict(a) # a und b verweisen auf unterschiedliche Objekte assert a is not b b["y"] = 2 a {'x': 1} b {'y': 2, 'x': 1}
Es gibt noch einen Stolperstein:
a = {"x": []} b = dict(a) assert a is not b b["x"].append(42) a {'x': [42]}
dict(...) kopiert nur das Dictionary, die Werte (im Beispiel die List) werden weiterhin geteilt. Hier hilft copy.deepcopy(), das rekursiv auch die Werte kopiert. Allerdings sieht man die Funktion meist nur in Programmen von Newbies, in der Regel ist es besser, die Daten nicht zu verschachteln.
participants (3)
-
Diez Roggisch
-
Peter Otten
-
Wagner, Frank