Der Parameter "self" in Python in anderen Funktionen als __init__?
Hallo Leute, ich nochmal :)
Ich versuche mich gerade nach einer kurzen Pause wieder in Python und habe eine Frage zum Parameter self: anfangs dachte ich, dass dieser nur bei der Funktion __init__ gebraucht wird, welche jedes Mal aufgerufen wird, wenn eine neues Objekt erstellt wird. (Jetzt habe ich einen Code gefunden, der self auch in anderen Funktionen verwendet.)
Zurzeit weiß ich, dass self ein Objekt ist. Mit self.xx kann man Attribute bezogen auf self implementieren und ihnen Werte zuteilen. (zB self.id = xx)
Wenn ich jedoch (zB) eine neue Funktion in der Klasse schreibe, in der ich __init__ schon verwendet habe kommt bei dieser Funktion: def funktion(self, num): ... folgende Fehlermeldung, wenn ich sie mit (x=klassenname.funktion(3)) aufrufe: testsS.f2() missing 1 required positional argument: 'num'
Bei dem erstellen meines Objektes (wenn hier überhaupt ein Objekt erstellt wird) muss ich jedoch nur ein Argument eingeben, da ich bei __init__ self nicht deklarieren muss...
Ich bitte um kurze Hilfe, da ich leider wenig Antworten finde...
Danke,
me
4 Antworten
Alle Funktionen in einer Klasse, deren erster Parameter self ist, werden als objektgebundene Funktionen gewertet. Das heißt, du kannst sie über ein Objekt der Klasse aufrufen.
Beispiel:
class Person:
def __init__(self, name):
self.name = name
def introduce_yourself(self, greeting):
print(greeting, "My name is", self.name + ".")
jessica = Person("Jessica")
jessica.introduce_yourself("Hi!")
Das Objekt (jessica) wird in diesem Fall implizit als erstes Argument an die Funktion (introduce_yourself) übergeben. Wenn du die Methode jedoch über den Klassennamen auflösen lässt, musst du den Parameter explizit bedienen:
Person.introduce_yourself(jessica, "Hi!")
Ist die Funktion noch Teil deiner Klasse?
Self ist eigentlich ein Impliziter Parameter und bezeichnet die Instanz.
Eine Referenz zu Klassen etc findest du natürlich auch in der Doku
Danke dir! Ja die Funktion ist noch ein Teil der Klasse.
Methoden die den Parameter self erwarten musst du entweder mit dem Objekt der Klasse aufrufen in der die Methode ausgeführt werden soll, also Objekt.funktion(nun) oder wenn du in der Klasse selbst bist über self.funktion(num)
Soll die Funktion denn für eine einzelne Instanz deiner Klasse gelten oder ist die Funktion unabhängig von Instanzen?
Beispiel Funktion, die für die jeweiligen Instanzen gilt:
class Auto:
def __init__(self, name):
# Variablen name und geschwindigkeit für das neue Auto anlegen
self.name = name
self.geschwindigkeit = 0
def losfahren(self):
# Die Geschwindigkeit dieses Autos verändern
self.geschwindigkeit = 50
# Zwei Autos anlegen
audi = Auto("Audi")
bmw = Auto("bmw")
# Die Geschwindigkeit von beiden Autos anzeigen
print(audi.geschwindigkeit)
print(bmw.geschwindigkeit)
# Ein Auto losfahren lassen
audi.losfahren() # Hier wird automatisch die Referenz auf das Objekt audi
# nach self übergeben
# Die Geschwindigkeit von beiden Autos anzeigen
print(audi.geschwindigkeit) # Der Audi fährt jetzt 50
print(bmw.geschwindigkeit) # Der BMW steht noch still
Beispiel statische Funktion (also unabhängig von Instanzen):
class Auto:
def __init__(self, name):
# Variablen name und geschwindigkeit für das neue Auto anlegen
self.name = name
self.geschwindigkeit = 0
# Der Decorator ist keine Pflicht,
# aber hilft, Programmierfehler zu vermeiden
@staticmethod
def spritverbrauch(kilometer, liter):
return f"{liter / (kilometer/100)} Liter pro 100 km"
# Zwei Autos anlegen
audi = Auto("Audi")
bmw = Auto("bmw")
# Die Funktion spritverbrauch lässt sich jetzt auch unabhängig von einem Auto aufrufen
print(Auto.spritverbrauch(750, 50))
# Durch den @staticmethod decorator kann man sie aber auch mit Instanzen aufrufen.
# weil der self-parameter dadurch nicht übergeben wird
# Man sollte die Funktion aber trotzdem lieber mit dem Klassennamen aufrufen,
# um Verwirrungen zu vermeiden
print(audi.spritverbrauch(750, 50))
print(bmw.spritverbrauch(750, 50))
Wow wirklich hilfreich, danke!