**kwargs in __init__() Methode und "self"

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
Code Snake
User
Beiträge: 1
Registriert: Freitag 7. April 2023, 12:10

Hey Leute,
ich habe heute begonnen, Kivy zu lernen. Kivy ist ein Python Framework, für plattformübergreifende Apps. Ich bin allerdings noch ein Anfänger in Python und da man für Kivy OOP beherrschen muss. Habe ich mir eben ein paar Tutorials angeschaut und das Konzept von Klassen auch verstanden und schon etwas geübt. Auch das "self" eine Referenz auf die aktuelle Instanz ist habe ich kapiert. Aber wieso kann man aus einer Methode auf die Instanzvariablen nur zugreifen, wenn vor diesen "self" steht?

Und meine zweite Frage ist, wozu bei der Initialisierung der __init__() Methode manchmal noch so ein **kwargs steht. Also hier mal ein Beispielcode:

Code: Alles auswählen

class MyGrid(GridLayout):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.word_list = ["python", "java", "ruby", "javascript"]
        self.guess_word = []
        self.secret_word = ""
        self.remaining_guesses = 6
        self.img_path = "img/hangman_{}.png"
        self.create_game_layout()
        self.new_game()
Das ist jetzt mal nur die __init__() Methode einer MyGrid Klasse die von GridLayout erbt.
Ach ja. Was dieses "super()" bedeutet habe ich auch nicht so ganz verstanden.

Ich wäre sehr sehr dankbar wenn mir jemand helfen könnte. Denn ich will für eine Projektarbeit im Informatikunterricht umbedingt eine Android Kivy App für Hangman programmieren. Aber dafür muss ich diese Themen erst einmal verstehen.

LG Code Snake :wink:
Benutzeravatar
snafu
User
Beiträge: 6871
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Das hat etwas mit den Namensräumen zu tun. Wenn du eine Variable innerhalb einer Methode definierst, dann ist die Variable von außen nicht sichtbar. Durch "self", was stellvertretend für die Instanz steht (wie du schon schriebst), wird der Namensraum quasi erweitert und alle Methoden der Klasse und ggf. von vererbten Klassen können auf die Variable zugreifen.

**kwargs bzw. **beliebiger_name lässt eine variable Anzahl an Keyword-Arguments zu (daher der Name). Das kann man unter anderem bei Vererbung oder anderer Form der Weiterreichung machen, wenn man die Argumente nicht explizit hinschreiben will oder sie an der Stelle nicht kennt.

super() steht für die Instanz der Elternklasse, hat aber so seine Tücken und wird von einigen hier im Forum nicht so gern gesehen, da es in bestimmten Fällen schwer zu durchschauen ist. Die Alternative ist, den Namen der betreffenden Elternklasse explizit hinzuschreiben.
Antworten