Kleine Frage zu 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
Littlehelp
User
Beiträge: 4
Registriert: Samstag 2. Juni 2018, 22:16

Hallo Liebes Forum,

leider habe ich noch immer nicht ganz verstanden wie self nun eigentlich funktioniert.

Mein Code:

Code: Alles auswählen

class wand():

    def __init__(self, color="blau"):
        self.c=color

    def givec(self):
        return self.c
Wenn ich nun in der shell wand.givec() abschicke dann erhalte ich den folgenden Fehler:

Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
wand.givec()
TypeError: givec() missing 1 required positional argument: 'self'
>>>

Ziel ist es, dass das Programm mir einfach wiedergibt, welche Farbe die Wand nun hat.
Zuletzt geändert von __deets__ am Samstag 2. Juni 2018, 22:32, insgesamt 1-mal geändert.
Grund: Code Tags
Sirius3
User
Beiträge: 18267
Registriert: Sonntag 21. Oktober 2012, 17:20

›self‹ ist ein magischer Parameter, der beim Aufruf einer Instanzmethode als erstes als die Instanz übergeben wird, ohne dass man ihn explizit angeben muß.

Du versuchst aber die Methode aufzurufen, ohne dass Du eine Instanz der Klasse erzeugt hast. Lösung: erzeuge eine Instanz.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du musst eine Instanz eines wand Objektes erzeugen & die Fragen. Um bei deinem Beispiel zu blieben: du versuchst, in jenen Raum voller Zauberer zu brüllen ‚welche Farbe hat der Zauberstab‘ und niemand weiss, wer gemeint ist.

Und darum bietet es sich an, den Python Style Konventionen in PEP8 zu folgen. Denn dann hieße deine Klasse Wand (mit großem W!), und es würde dir optisch gleich auffallen, dass du die Klasse fragst, und nicht den Zauberstab von Hermione.

Also wand in Wand umbenennen, und dann läuft es mit

Code: Alles auswählen

meiner = Wand('morgenuringelb')
print(meiner.givec())
Last but not least: man würde in python niemals eine solche Methode givec schreiben. Sondern das Attribut gleich vernünftig color nennen, die Methode wegwerfen, und

Code: Alles auswählen

print(meiner.color)
schreiben.
Littlehelp
User
Beiträge: 4
Registriert: Samstag 2. Juni 2018, 22:16

Das macht natürlich Sinn, vielen Dank für die Antworten, das erleichtert mir einiges^^
Antworten