Der Parameter "self" in Python in anderen Funktionen als __init__?

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!")
samarisqaa 
Fragesteller
 12.07.2023, 12:01

Macht Sinn, danke!

0

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

https://docs.python.org/3/tutorial/classes.html

samarisqaa 
Fragesteller
 12.07.2023, 12:02

Danke dir! Ja die Funktion ist noch ein Teil der Klasse.

0

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)

Woher ich das weiß:Berufserfahrung – Software Entwickler

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))