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.
class externe_Klasse_Original(externe_Klasse_a, externe_Klasse_b):
Ich will jetzt externe_Klasse_Original(meine_a_Klasse, externe_Klasse_b) erhalten, wie mache ich das?
__deets__ hat geschrieben: ↑Samstag 30. November 2019, 14:15
Du hast abgelitten.
Zum Thread: Ich verstehe in dem Zusammenhang nicht, was überschrieben werden soll. Und die Benennung im Beispiel macht die Verwirrung nicht kleiner. Vielleicht ist die Elternklasse gemeint? Dafür wäre super() eine Möglichkeit...
snafu hat geschrieben: ↑Samstag 30. November 2019, 15:23
__deets__ hat geschrieben: ↑Samstag 30. November 2019, 14:15
Du hast abgelitten.
Zum Thread: Ich verstehe in dem Zusammenhang nicht, was überschrieben werden soll. Und die Benennung im Beispiel macht die Verwirrung nicht kleiner. Vielleicht ist die Elternklasse gemeint? Dafür wäre super() eine Möglichkeit...
Ich habe das Wort überschrieben gewählt, weil die externe Klasse Quellcode erhält sowie a und b abgeleitet,
ich will die gleiche Klasse statt von a und b abgeleitet von mein_a und b.
Das klingt als ob du Klassen die es schon gibt verändern willst, statt eine neue Ableitung zu erstellen. Das ist nur schwer möglich und sollte vermieden werden. Hol doch mal etwas weiter aus, was da konkret erreicht werden soll. Welche Bibliothek, welche Funktionalität darin, was du ändern willst.
Vielleicht noch als Anmerkung das IMHO Mehrfachvererbung schon ein Warnzeichen ist das man da nur dran gehen soll wenn man Vererbung im allgemeinen und Python im besonderen an der Stelle sehr gut verstanden hat. Und wenn sich das bei der Vererbung nicht um eine einfache Mixin-Klasse handelt, die einfach nur zusätzliche Methoden einbringt und selbst keinen Zustand hat, habe ich persönlich immer das Bedürfnis schreiend weg zu laufen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
__deets__ hat geschrieben: ↑Samstag 30. November 2019, 15:47
Das klingt als ob du Klassen die es schon gibt verändern willst, statt eine neue Ableitung zu erstellen. Das ist nur schwer möglich und sollte vermieden werden. Hol doch mal etwas weiter aus, was da konkret erreicht werden soll. Welche Bibliothek, welche Funktionalität darin, was du ändern willst.
Ich habe doch schon ein konkretes Beispiel genannt.
Wass ich jetzt mache ist, dass ich den Code externe_Klasse_Original rauskopiere und in mein Proojekt einfüge und dann statt
externe_Klasse_Original(a,b) :
class meine_externe_Klasse_Original(mein_a, b):
...
schreibe
Das will ich aber nicht, weil externe_Klasse_Original ja von Version zu Version unterschiedlich sein kann.
Hört sich so an als ob ein Problem mit Vererbung gelöst werden soll, das mit Komposition leichter zu lösen wäre. Dafür müsste der OP aber konkreter werden, was er offenbar nicht will.
Alternativ lässt es sich über eine Factory-Funktion lösen. Diese erstellt die Basisklasse und von ihr wird dann abgeleitet. Einige Frameworks nutzen dieses Vorgehen. Sieht schematisch dann halt so aus:
Dieses Vorgehen macht dann Sinn, wenn die Erstellung das Basisklasse von wie auch immer gearteten äußeren Faktoren abhängt (Betriebssystem bzw Laufzeitumgebung, Einstellungen in Konfigurationsdateien, Quellcode von außerhalb, was-auch-immer). In der Java-Welt ist dieser Ansatz recht populär, was ihn aber natürlich nicht automatisch gut macht - schon gar nicht für jede Situation.
snafu hat geschrieben: ↑Samstag 30. November 2019, 16:18
Alternativ lässt es sich über eine Factory-Funktion lösen. Diese erstellt die Basisklasse und von ihr wird dann abgeleitet. Einige Frameworks nutzen dieses Vorgehen. Sieht schematisch dann halt so aus:
Dieses Vorgehen macht dann Sinn, wenn die Erstellung das Basisklasse von wie auch immer gearteten äußeren Faktoren abhängt (Betriebssystem bzw Laufzeitumgebung, Einstellungen in Konfigurationsdateien, Quellcode von außerhalb, was-auch-immer). In der Java-Welt ist dieser Ansatz recht populär, was ihn aber natürlich nicht automatisch gut macht - schon gar nicht für jede Situation.
Meinst Du so?
class meine_externe_Klasse_Original(externe_Klasse_Original(), mein_a, b):
Theoretisch schon, aber um von drei Klassen gleichzeitig abzuleiten, muss es schon sehr sehr gute Gründe geben. Außer Interfaces fällt mir da nichts ein. Und auch da sind 3 Klassen / Schnittstellen ziemlich krass. Man würde dann eher als Zwischenschritt eine neue gemeinsame Basisklasse definieren, die die verschiedenen "Welten" zusammenführt und eine sinnvolle Schnittstelle nach außen anbietet. Ansonsten blickt da doch niemand mehr durch.
snafu hat geschrieben: ↑Samstag 30. November 2019, 16:30
Theoretisch schon, aber um von drei Klassen gleichzeitig abzuleiten, muss es schon sehr sehr gute Gründe geben. Außer Interfaces fällt mir da nichts ein. Und auch da sind 3 Klassen / Schnittstellen ziemlich krass. Man würde dann eher als Zwischenschritt eine neue gemeinsame Basisklasse definieren, die die verschiedenen "Welten" zusammenführt und eine sinnvolle Schnittstelle nach außen anbietet. Ansonsten blickt da doch niemand mehr durch.
Ich will keine 3 Klassen ableiten.
Die externe Klasse wird von 2 Klassen abgeleitet, wobei ich ihre erste abgeleitete Klasse durch meine ersetzen möchte.
Erstmal: es gibt keinen Weg, wie du sauber von außen in die Ableitungshierarchie eingreifen kannst. Das ist immer Mist, und die Probleme die durch Code kopieren entstehen, entstehen auch durch monkey patching.
Zweitens: durch die Weigerung, Ross und Reiter zu benennen verhinderst du, dass man alternative Wege das Ziel zu erreichen vorschlagen kann
__deets__ hat geschrieben: ↑Samstag 30. November 2019, 16:45
Erstmal: es gibt keinen Weg, wie du sauber von außen in die Ableitungshierarchie eingreifen kannst. Das ist immer Mist, und die Probleme die durch Code kopieren entstehen, entstehen auch durch monkey patching.
Deswegen frage ich ja, wie ich eine Kopie von dieser Klasse erstellen kann und nur die erste abgeleitete Klasse austauschen kann.
class externe_Klasse_Original(externe_Klasse_a, externe_Klasse_b):
Ich will jetzt eine eigene Klasse als externe_Klasse_Original(meine_a_Klasse, externe_Klasse_b) deklarieren, wie mache ich das?
Warum sollte es Unsinn sein etwas wieder zu verwenden was es schon gibt.
Du würdest also denn ganzen Quellcode rauskopieren und Kompatibilitäts Probleme in Kauf nehmen?
Hier vermuten alle, dass die Lösung, die Du im Kopf hast, nicht ideal ist. Manchmal verrennt man sich in eine Idee und sieht gar nicht mehr, dass man auf einem anderen Weg besser ans Ziel kommt. Hier heißt der bessere Weg Komposition. Um Dir aber konkrete Tipps geben zu können, müssen wir mehr über Dein Problem erfahren.