ich bin neu hier und auch noch nicht so lange am programmieren in Python dran. Ich habe eine Frage und Ihr müsst bitte entschuldigen, falls meine Beschreibungen an der ein oder anderen Stelle nicht die korrekten Fachtermini enthalten.
Nun zur Frage:
Einmal angenommen ich habe eine Klasse Auto neben anderen Attributen hat dieses Auto das Attribut Rad. Rad ist wiederum selbst eine Klasse und besitzt das z.B. Attribut Reifen und Felge, dazu folgendes Skript:
Code: Alles auswählen
class Rad():
def __init__(self, reifen, felge):
self._reifen = reifen
self._felge = felge
@property
def reifen(self):
return self._reifen
@reifen.setter
def reifen(self,neuer_reifen):
self._reifen = neuer_reifen
class Auto():
def __init__(self, rad, motor):
self._rad = rad
self._motor = motor
def print_reifen(self):
print(self._rad.reifen)
# Instanzierung des Rades: aVWCaddyRad
aVWCaddyRad = Rad("Sommerreifen", "Aluminiumfelge")
print(id(aVWCaddyRad))
# Instanzierung des Automodells: aVWCaddy
aVWCaddy = Auto(aVWCaddyRad,"V8-Motor")
aVWCaddy.print_reifen()
# Änderung des Attributes Reifen der Klasse Rad und Auswirkung auf die Klasse Auto
aVWCaddyRad.reifen = "Winterreifen"
print(id(aVWCaddyRad))
aVWCaddy.print_reifen()
2828178694160
Sommerreifen
2828178694160
Winterreifen
Bei der Initialisierung des Rads habe ich festgelegt, dass es sich bei der Bereifung um einen "Sommerreifen" handeln soll. Da nun der Winter kommt und die Räder auf den gleichen Felgen neue Reifen aufgezogen bekommt, andert sich das Attribut _reifen über den reifen.setter zu "Winterreifen". Wie man an der Ausgabe von der Methode print_reifen (in der Klasse Auto) sieht ändert sich damit auch automatisch das Attribut _rad des Objektes aVWCaddy.
Wie man anhand der Speicheradressen sieht ändert sich für das Objekt aVWCaddy die Speicheradresse bei Anderung des Attributes _rad nicht und damit zeigt das Objekt aVWCaddy immer noch auf das gleiche aVWCaddyRad. Ist es immer so für den Fall, dass ich Attribute einer Klasse verändere, dass gleichzeitig ein Attribut einer anderen Klasse darstellt?
Ich weiß, dass z.B. Integer Imutable sind, d.h. bei Zuweisung eines Zahlenobjektes zu einer Variable, die vorher auf ein anderes Zahlenobjekt zeigte, führt zur Änderung der Speicheradresse. Angenommen ein Attribut des Objektes aVWCaddy wäre _leistung, die als PS des Autos beschrieben wäre. Ändert sich die Leistung des Autos durch z.B. tuning, so ändert sich die Speicheradresse des Attributes _leistung. Allerdings ändert sich damit einhergehend nicht die Adresse des aVWCaddy, sondern eben nur der "Zeiger" auf das Attribut?
Kann hier auch eine Art "call-by-value" auftreten, wo eine Kopie erzeugt wird und sich das Attribut in der außenliegenden Klasse (in diesem Fall Auto) nicht ändert? Ich wäre sehr über ausführliche Erläuterungen dankbar, ich möchte besser verstehen was es mit dem Python spezifischen "Call by Object Reference" zu tun hat.
Viele Grüße und schönes Wochenende an alle!