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.
Amerika_befreie_uns
User
Beiträge: 50
Registriert: Sonntag 15. November 2015, 08:28

Samstag 30. November 2019, 13:22

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: 7390
Registriert: Mittwoch 14. Oktober 2015, 14:29

Samstag 30. November 2019, 14:15

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: 6024
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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...
Amerika_befreie_uns
User
Beiträge: 50
Registriert: Sonntag 15. November 2015, 08:28

Samstag 30. November 2019, 15:36

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?
Amerika_befreie_uns
User
Beiträge: 50
Registriert: Sonntag 15. November 2015, 08:28

Samstag 30. November 2019, 15:39

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: 11331
Registriert: Sonntag 21. Oktober 2012, 17:20

Samstag 30. November 2019, 15:41

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

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

Samstag 30. November 2019, 15:51

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. 😀
long long ago; /* in a galaxy far far away */
Amerika_befreie_uns
User
Beiträge: 50
Registriert: Sonntag 15. November 2015, 08:28

Samstag 30. November 2019, 16:07

__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: 6024
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Samstag 30. November 2019, 16:11

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: 6024
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
Amerika_befreie_uns
User
Beiträge: 50
Registriert: Sonntag 15. November 2015, 08:28

Samstag 30. November 2019, 16:24

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: 6024
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
Amerika_befreie_uns
User
Beiträge: 50
Registriert: Sonntag 15. November 2015, 08:28

Samstag 30. November 2019, 16:38

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: 7390
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.

Zweitens: durch die Weigerung, Ross und Reiter zu benennen verhinderst du, dass man alternative Wege das Ziel zu erreichen vorschlagen kann 🤷🏼‍♂️
Antworten