OOP mit 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
maxwebbi
User
Beiträge: 2
Registriert: Mittwoch 30. Mai 2018, 14:40

Hallo zusammen,

ich beschäftige mich seit heute mit OOP in Python und habe mal ein paar Fragen:

Angenommen ich habe folgende Klasse:

Code: Alles auswählen

class Car():
	
	tires = 4
	
   	def __init__(self):
       		self.price = 5000
       		
Erstelle ich immer auf die Art und Wiese mit

Code: Alles auswählen

MeinObjekt.MeineInstanzVariable = ...
eine Instanzvariable?

In meinem Beispiel ist "tires" ja eine statische Variable und man kann über "Car.tires" draufzugreifen. Was würde passieren, wenn ich folgendes machen würde:

Code: Alles auswählen

class Car():
	
   	def __init__(self):
   		tires = 4
       		self.price = 5000
       		
Meine statische Variable "tires" würde also jedes mal beim Erstellen einer neuen Instanz auf 4 gesetzt werden. Macht zwar keinen Sinn, aber rein hypothetisch?!
Über "Car.tires" kann ich ja nun nicht mehr drauf zugreifen. Gibt es ein Szenario, in dem man sowas machen würde?

Danke! :)
Sirius3
User
Beiträge: 17746
Registriert: Sonntag 21. Oktober 2012, 17:20

Eingerückt wird generell mit 4 Leerzeichen, dann ist der Code auch lesbar. `tires` ist im ersten Fall eine Klassenvariable, statische Variablen gibt es nicht. Im zweiten Fall ist `tires` eine lokale Variable und `price` eine Instanzvariable.

Und "von außen" sollte man gar keine Instanzvariablen erzeugen. Alle Instanzvariablen, die ein Objekt braucht, werden in `__init__` initialisiert.
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

da es ja auch Autos mit weniger als 4 Rädern gibt, könnte man es ja so machen
default sind 4 Räder, man kann aber auch andere Werte angeben
Es gibt vielleicht Gründe für die Verwendung von Klassenvariablen oder lokalen Variablen in Klassen, in diesem Beispiel mMn eher nicht

Code: Alles auswählen

class Car():
    def __init__(self, price, tires=4)):
        self.tires = tires
       	self.price = price

dreirad = Car(100, 3)
mercedes = Car(50000)

Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
maxwebbi
User
Beiträge: 2
Registriert: Mittwoch 30. Mai 2018, 14:40

Sirius3 hat geschrieben: Mittwoch 30. Mai 2018, 15:11 Eingerückt wird generell mit 4 Leerzeichen, dann ist der Code auch lesbar. `tires` ist im ersten Fall eine Klassenvariable, statische Variablen gibt es nicht. Im zweiten Fall ist `tires` eine lokale Variable und `price` eine Instanzvariable.

Und "von außen" sollte man gar keine Instanzvariablen erzeugen. Alle Instanzvariablen, die ein Objekt braucht, werden in `__init__` initialisiert.

Das heißt in meinem zweiten Fall ist 'tires' nur für interne Berechnungen oder ähnliches benutzbar und von außen gar nicht anzusprechen?
Sirius3
User
Beiträge: 17746
Registriert: Sonntag 21. Oktober 2012, 17:20

Ja, so wie lokale Variablen innerhalb beliebiger Funktionen nur innerhalb der Funktion gültig sind.
Antworten