Abgeleitete Klasse überschreiben

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.
anonym44

Ich möchte eine Abgeleitete Klasse überschreiben, weiß aber nicht wie es geht:

Code: Alles auswählen

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__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Was heißt denn ‚erhalten‘? Du hast abgelitten. Und kannst deine neue Klasse jetzt instantiieren. Wie sonst auch. Was genau geht da nicht?
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

__deets__ hat geschrieben: Samstag 30. November 2019, 14:15 Du hast abgelitten.
:lol:

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...
anonym44

Ich habe die bestehende Klasse externe_Klasse_Original die von a und b abgeleitet ist,

ich brauche aber externe_Klasse_Original an statt von a von my_a und b abgeleitet ist.


Wie geht das?
anonym44

snafu hat geschrieben: Samstag 30. November 2019, 15:23
__deets__ hat geschrieben: Samstag 30. November 2019, 14:15 Du hast abgelitten.
:lol:

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.
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Dann ändere das doch einfach.
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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
anonym44

__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.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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:

Code: Alles auswählen

class MyClass(make_baseclass()):
    # ...
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.
anonym44

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:

Code: Alles auswählen

class MyClass(make_baseclass()):
    # ...
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):
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
anonym44

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.
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

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 🤷🏼‍♂️
anonym44

__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?
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Um das mal zu paraphrasieren, damit es klar wird:

__deets__ : "Was tu tun willst ist Unsinn."
Amerika_befreie_uns : "Genau! Deswegen will ich es ja so machen!"
In specifications, Murphy's Law supersedes Ohm's.
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nicht nur Unsinn. Auch unmöglich. Aber dem Herrn Kafka ist jetzt auch genug gehuldigt. EOD.
anonym44

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?
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
Antworten