Seite 1 von 1
Klassen in Python
Verfasst: Mittwoch 23. Oktober 2019, 06:54
von seeberg
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
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())
Re: Klassen in Python
Verfasst: Mittwoch 23. Oktober 2019, 06:57
von sparrow
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.
Re: Klassen in Python
Verfasst: Mittwoch 23. Oktober 2019, 07:03
von seeberg
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?
Re: Klassen in Python
Verfasst: Mittwoch 23. Oktober 2019, 07:18
von __deets__
Jein. Das erzeugt eine Instanz, insofern: ja. Aber deine a, b, c sind trotzdem falsch! Die müssen in __init__ angelegt werden.
Re: Klassen in Python
Verfasst: Mittwoch 23. Oktober 2019, 07:19
von sparrow
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__.
Re: Klassen in Python
Verfasst: Mittwoch 23. Oktober 2019, 09:28
von seeberg
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.
Re: Klassen in Python
Verfasst: Mittwoch 23. Oktober 2019, 09:38
von __blackjack__
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?