Klassen in Python

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
seeberg
User
Beiträge: 9
Registriert: Sonntag 20. Oktober 2019, 13:13

Hallo,
ich bin Anfänger und habe ein Problem beim Erstellen von Methoden in einer Klasse. Im Internet wird immer gesagt, bei einer Methode solle der erste (quasi unechte) Parameter self sein, um auf andere Dinge die in der Klasse enthalten sind, zuzugreifen. Aber mein Python mag dieses self anscheinend nicht :D
Edit: Beim Einfügen meines Script wurden leider die Einrückungen missachtet...
class MyClass:

a = 0
b = 1
c = 2

def funk(self, d=1):
print(self.b, self.a, self.d)


instanz = MyClass
print(instanz.funk())

Nun die Fehlermeldung:

Exception has occurred: TypeError
funk() missing 1 required positional argument: 'self'
File "/Users/janneck/Documents/Python/project2.py", line 23, in <module>
print(instanz.funk())
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Benutze die Code-Tags. Die Einrückungen sind für Python fundamental.
Die Code-Tags erzeugst du über die </> Buttons im vollständigen Editor.

Zu deinem Code: So erzeugt man keine Instanzen von Klassen. Du bindest die Klasse (also die quasi die Definition) an den Namen "instanz", nicht etwa eine Instanz der Klasse. Bei der instanzierung einer Klasse können (über die __init__-Methode der Klasse) Parameter gefordert sein. Die müssen (vergleichbar mit einem Methodenaufruf) in Klammern hinter dem Klassennamen stehen. Bei dir müssten sie leer sein, aber deshalb kann man sie nicht weglassen.

Also, wie instanziert man eine Klasse?

Hast du verstanden, dass die Variablen, die du in der Klasse definierst Klassenvariablen sind? Eigentlich möchtest du die nämlich an self binden. Und das tut man in __init__. Bitte schau noch einmal nach, was __init__ tut.
seeberg
User
Beiträge: 9
Registriert: Sonntag 20. Oktober 2019, 13:13

sparrow hat geschrieben: Mittwoch 23. Oktober 2019, 06:57 Benutze die Code-Tags. Die Einrückungen sind für Python fundamental.
Die Code-Tags erzeugst du über die </> Buttons im vollständigen Editor.

Zu deinem Code: So erzeugt man keine Instanzen von Klassen. Du bindest die Klasse (also die quasi die Definition) an den Namen "instanz", nicht etwa eine Instanz der Klasse. Bei der instanzierung einer Klasse können (über die __init__-Methode der Klasse) Parameter gefordert sein. Die müssen (vergleichbar mit einem Methodenaufruf) in Klammern hinter dem Klassennamen stehen. Bei dir müssten sie leer sein, aber deshalb kann man sie nicht weglassen.

Also, wie instanziert man eine Klasse?

Hast du verstanden, dass die Variablen, die du in der Klasse definierst Klassenvariablen sind? Eigentlich möchtest du die nämlich an self binden. Und das tut man in __init__. Bitte schau noch einmal nach, was __init__ tut.
Ich habe nun zwei Klammern in der vorletzten Zeile an MyClass gehangen, und nun funktioniert es. War das alles?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Jein. Das erzeugt eine Instanz, insofern: ja. Aber deine a, b, c sind trotzdem falsch! Die müssen in __init__ angelegt werden.
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Hast du verstanden, was self macht? Self gibt e auch in anderen Sprachen, nur wird es dort in der Regel nicht in den Parametern benannt.
"self" ist per Kovention der Name der Instanz. Wenn du also a, b, und c in jeder Instanz von MyClass unterschiedlich haben willst (und ich bin mir sicher, dass du das willst), dann müssen die self.a, self.b und self.c heißen. Und da self an der Stelle, wo du sie initialisierst, nicht bekannt ist ist, brauchst du __ini__.
seeberg
User
Beiträge: 9
Registriert: Sonntag 20. Oktober 2019, 13:13

sparrow hat geschrieben: Mittwoch 23. Oktober 2019, 07:19 Hast du verstanden, was self macht? Self gibt e auch in anderen Sprachen, nur wird es dort in der Regel nicht in den Parametern benannt.
"self" ist per Kovention der Name der Instanz. Wenn du also a, b, und c in jeder Instanz von MyClass unterschiedlich haben willst (und ich bin mir sicher, dass du das willst), dann müssen die self.a, self.b und self.c heißen. Und da self an der Stelle, wo du sie initialisierst, nicht bekannt ist ist, brauchst du __ini__.
Danke euch beiden. Könnte mir bitte jemand ein Pythonscript zu Klassen machen, so ganz habe ich es nämlich in der Praxis nicht kapiert.
Benutzeravatar
__blackjack__
User
Beiträge: 14050
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Dein Beispiel in funktionierend und richtig:

Code: Alles auswählen

#!/usr/bin/env python3


class Class:
    def __init__(self, a=0, b=1, c=2):
        self.a = a
        self.b = b
        self.c = c

    def method(self, d=1):
        print(self.b, self.a, d)


def main():
    instance = Class()
    instance.method()


if __name__ == "__main__":
    main()
Zu den Namen: ``my`` ist in 99,9% der Fälle ein komplett sinnfreier Namenspräfix. Wenn es nicht auch `OurClass` und/oder `TheirClass` gibt, was soll das `My` dann bedeuten?
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten