Probleme mit dem vererben

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.
Antworten
Neu111
User
Beiträge: 69
Registriert: Dienstag 10. März 2020, 19:02

Hallo,
hier ein Auszug aus meiner Klasse:

Code: Alles auswählen

class meineHauptklasse(wx.Frame):
    def __init__(self, parent, title):
       ...
       print("hello world")
       no_caption = wx.SYSTEM_MENU | wx.CAPTION 
       super(meineHauptklasse, self).__init__(parent, title=title, pos=(100,50), size=(600,300), style=no_caption)
       ...
       ...

    def test1:
    
    def test2:
Nun möchte ich eine weitere Klasse erstellen, die auf die Methoden der ersten Klasse zurückgreifen kann (test1 und test2).

Beispiel:

Code: Alles auswählen

class meineUnterklasse(meineHauptklasse):
    def __init__(self, parent, title):
        super(meineUnterklasse, self).__init__(parent, title=title)
Nun ergibt sich folgendes Problem:
Beim Aufruf von "meineUnterklasse" als Objekt wird auch der Code ausgeführt, der sich in meineHauptklasse -> __init__ befindet (sprich: es wird "hello world" ausgegeben).

Wie muss ich den Code ändern, damit "meineUnterklasse" zwar auf "test1" und "test2" zugreifen kann, der Code innerhalb von "__init__" aus der "meineHauptklasse" aber NICHT ausgeführt wird?


Das eigentliche Ziel war auch, dass ich mit "meineUnterklasse" ein neues WX-Fenster erstellen kann, dass sich in punkto Position und Größe vom Hauptfenster abweicht. Beispiel-Code:

Code: Alles auswählen

class meineUnterklasse(meineHauptklasse):
    def __init__(self, parent, title):
    	no_caption = wx.CLOSE_BOX
        super(meineUnterklasse, self).__init__(parent, title=title, pos=(200,80), size=(800,600), style=no_caption)
In diesem Fall erscheint aber die Fehlermeldung "TypeError: __init__() got an unexpected keyword argument 'pos'"

Wieso kann ich für meineUnterklasse keine eigene Position des neuen wx-Fensters definieren?

Wenn mir jemand helfen würde, wäre ich euch sehr dankbar!
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du brauchst Komposition, nicht Vererbung. Deine Unterklasse darf also keine solche sein, sondern bekommt die Instanz des Frames als Argument im Konstruktor, merkt sich die, und ruft dann eben testX auf.
Benutzeravatar
__blackjack__
User
Beiträge: 13268
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Neu111: Klassennamen fangen mit einem Grossbuchstaben an. Und so sinnfreie Zusätze wie `meine` sollte man sich sparen, auch in Beispielen.

Wenn Du die `__init__()` der Elternklasse aufrufst dann wird die halt auch ausgeführt, deswegen ruft man die ja auf. Und man sollte die auch aufrufen, denn wenn man die Initialisierung dort nicht braucht, ist fraglich warum man überhaupt davon erbt.

Und natürlich kannst Du einer Methode die als ``def __init__(self, parent, title):`` definiert ist, nicht einfach ein `pos`-Schlüsselwortargument übergeben.

Position und Grösse von Fenstern sollte man aber sowieso nicht selbst vorgeben wollen. Grösse nur wenn das Fenster sinnvoll dynamisch in der Grösse veränderbar ist, weil da Teile sind die automatisch mitwachsen/-schrumpfen.

Du willst vielleicht eher statt von `Hauptklasse` zu erben eine gemeinsame Basisklasse schreiben von denen beide Klassen erben‽ Und beliebige Argumente und Schlüsselwortargumente in deren `__init__()` erwarten und die an die Elternklasse druchreichen, oder eventuell auch gar keine `__init__()` schreiben. Wobei so etwas in der Regel auch komisch ist für eine Klasse die keine reine Mixin-Klasse ist, sondern ihrerseits von etwas konkretem erbt.

`super()` braucht keine Argumente, die solltest Du weglassen.
Please call it what it is: copyright infringement, not piracy. Piracy takes place in international waters, and involves one or more of theft, murder, rape and kidnapping. Making an unauthorized copy of a piece of software is not piracy, it is an infringement of a government-granted monopoly.
Neu111
User
Beiträge: 69
Registriert: Dienstag 10. März 2020, 19:02

__deets__ hat geschrieben: Donnerstag 31. Dezember 2020, 17:05 Du brauchst Komposition, nicht Vererbung.
Danke, du hast mich zum Ziel geführt.

Folgender Code innerhalb von "meineUnterklasse" funktioniert:

Code: Alles auswählen

print(meineHauptklasse.test1(None))
Sirius3
User
Beiträge: 17844
Registriert: Sonntag 21. Oktober 2012, 17:20

@Neu111: das war sicher nicht __deets__` Absicht, Dich auf solchen Unsinn gebracht zu haben. Wenn test1 gar keine Exemplar der meinHauptklasse braucht, dann gehört die Methode auch nicht in eine Klasse.
Antworten