Seite 1 von 2

Abgeleitete Klasse überschreiben

Verfasst: Samstag 30. November 2019, 13:22
von 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?


Re: Abgeleitete Klasse überschreiben

Verfasst: Samstag 30. November 2019, 14:15
von __deets__
Was heißt denn ‚erhalten‘? Du hast abgelitten. Und kannst deine neue Klasse jetzt instantiieren. Wie sonst auch. Was genau geht da nicht?

Re: Abgeleitete Klasse überschreiben

Verfasst: Samstag 30. November 2019, 15:23
von snafu
__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...

Re: Abgeleitete Klasse überschreiben

Verfasst: Samstag 30. November 2019, 15:36
von 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?

Re: Abgeleitete Klasse überschreiben

Verfasst: Samstag 30. November 2019, 15:39
von 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.

Re: Abgeleitete Klasse überschreiben

Verfasst: Samstag 30. November 2019, 15:41
von Sirius3
Dann ändere das doch einfach.

Re: Abgeleitete Klasse überschreiben

Verfasst: Samstag 30. November 2019, 15:47
von __deets__
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.

Re: Abgeleitete Klasse überschreiben

Verfasst: Samstag 30. November 2019, 15:51
von __blackjack__
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. 😀

Re: Abgeleitete Klasse überschreiben

Verfasst: Samstag 30. November 2019, 16:07
von 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.

Re: Abgeleitete Klasse überschreiben

Verfasst: Samstag 30. November 2019, 16:11
von snafu
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.

Re: Abgeleitete Klasse überschreiben

Verfasst: Samstag 30. November 2019, 16:18
von snafu
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.

Re: Abgeleitete Klasse überschreiben

Verfasst: Samstag 30. November 2019, 16:24
von 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):

Re: Abgeleitete Klasse überschreiben

Verfasst: Samstag 30. November 2019, 16:30
von snafu
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.

Re: Abgeleitete Klasse überschreiben

Verfasst: Samstag 30. November 2019, 16:38
von 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.

Re: Abgeleitete Klasse überschreiben

Verfasst: Samstag 30. November 2019, 16:45
von __deets__
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 🤷🏼‍♂️

Re: Abgeleitete Klasse überschreiben

Verfasst: Samstag 30. November 2019, 17:13
von 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?

Re: Abgeleitete Klasse überschreiben

Verfasst: Samstag 30. November 2019, 17:49
von pillmuncher
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!"

Re: Abgeleitete Klasse überschreiben

Verfasst: Samstag 30. November 2019, 17:55
von __deets__
Nicht nur Unsinn. Auch unmöglich. Aber dem Herrn Kafka ist jetzt auch genug gehuldigt. EOD.

Re: Abgeleitete Klasse überschreiben

Verfasst: Sonntag 1. Dezember 2019, 05:08
von 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?

Re: Abgeleitete Klasse überschreiben

Verfasst: Sonntag 1. Dezember 2019, 07:19
von Sirius3
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.