Python: Klassen: Unterschied zwischen den Versionen
Flinh1 (Diskussion | Beiträge) (→__init__) |
Flinh1 (Diskussion | Beiträge) (→__str__) |
||
Zeile 50: | Zeile 50: | ||
Funktion, die automatisch aufgerufen wird, wenn der Objektname als String verwendet werden soll. | Funktion, die automatisch aufgerufen wird, wenn der Objektname als String verwendet werden soll. | ||
− | + | class Auto: | |
− | + | def __init__(self,marke,farbe): | |
+ | self.marke = marke | ||
+ | self.farbe = farbe | ||
+ | |||
+ | def __str__(self): | ||
+ | antwort = "Das Objekt ist ein Auto. " | ||
+ | antwort += "Es ist ein " +self.marke+". " | ||
+ | antwort += "Die Farbe ist "+self.farbe+". " | ||
+ | return antwort | ||
+ | |||
+ | auto1 = Auto('Peugeot', "Silber") | ||
+ | print(auto1) # Ausgabe: Das Objekt ist ein Auto. Es ist ein Peugeot. Die Farbe ist Silber. | ||
+ | </nowiki> | ||
+ | |||
+ | ---- | ||
---- | ---- |
Version vom 2. Dezember 2020, 09:55 Uhr
Inhaltsverzeichnis
Allgemeines
Beispiel für Klasse und ihre Instanziierung:
class Tiere: def bewegen(self): print("Ich bewege mich") def fressen(self): print("Ich fresse.") class Rind(Tiere): def __init__(self, flecken): self.kuhflecken = flecken def findeFutter(self): self.bewegen() print("Ich habe Futter gefunden!") self.fressen() elsa = Rind(20) print("Anzahl der Flecken:", elsa.kuhflecken) elsa.findeFutter()
Besondere Methoden
__init__
Dient als Konstruktor:
class Auto: def __init__(self,marke,farbe): self.marke = marke self.farbe = farbe auto1 = Auto('Peugeot', "Silber") print(auto1) # Ausgabe: <__main__.Auto object at 0x7fb2b541c9d0>
__str__
Funktion, die automatisch aufgerufen wird, wenn der Objektname als String verwendet werden soll. class Auto:
def __init__(self,marke,farbe): self.marke = marke self.farbe = farbe
def __str__(self): antwort = "Das Objekt ist ein Auto. " antwort += "Es ist ein " +self.marke+". " antwort += "Die Farbe ist "+self.farbe+". " return antwort
auto1 = Auto('Peugeot', "Silber") print(auto1) # Ausgabe: Das Objekt ist ein Auto. Es ist ein Peugeot. Die Farbe ist Silber. </nowiki>
Getter, Setter, property
- Getter ermöglichen eine modifiziert Ausgabe, z. B. Rundung oder Formatierung
- Setter erlauben einen kontrollierten Zugriff, z. B. einschränkende Bedingungen
- Ausschließlich lesbare Propertys: wenn ein Wert nur über Klassenmethoden geändert wird (z. B. Kontostand, Kilometerstand).
class Auto: def __init__(self): print("Ein Auto!") self._wischerstellung = 0 def get_wischerstellung(self): print("Hier die Wischerstellung") return self._wischerstellung def set_wischerstellung(self, wisch): if wisch >= 0 and wisch <=4: print(f"Setze Wischerstellung {wisch}") self._wischerstellung = wisch else: print("Unerlaubter Bereich") wischerstellung = property(get_wischerstellung,set_wischerstellung) peugeot = Auto() peugeot.wischerstellung = 2 print(peugeot._wischerstellung) peugeot.set_wischerstellung(5) print(peugeot._wischerstellung)
Statische Methoden
Statische Methoden greifen auf Klassenattribute, nicht auf Instanzenattribute zu. Dabei dient @staticmethod
als function decorator. Damit wird die statische Methode an die Klasse gebunden, die somit keinen Bezug zu den Instanzen hat. Wenn man @staticmethod
weglässt, kann die statische Methode zwar noch über den Klassennamen, aber nicht mehr über den Namen der Instanz aufgerufen werden.
# Klassendefinition (Auto) class Auto: anzahl_automatik = 0 anzahl_schaltgetriebe = 0 def __init__(self, marke, automatik): self.marke = marke print("Neues Auto erstellt") if automatik: Auto.anzahl_automatik += 1 else: Auto.anzahl_schaltgetriebe += 1 #@staticmethod def zeige_statistik(): print("Autos mit Automatikgetriebe:", Auto.anzahl_automatik) print("Autos mit Schaltgetriebe", Auto.anzahl_schaltgetriebe) print("") Kalista S. 149
Alternativ zu @staticmethod
:
zeige_statistik = staticmethod(zeige_statistik)
Vererbung
Grundschema
class Elektroauto(Auto): def __init__(self, make, model, year): super().__init__(make, model,year)
Die Funktion super() weist Python an, die Funktion __init__ der Elternklasse aufzurufen.
Instanzen als Attribute einer Klasse
Die Instanz einer Klasse (hier: Klasse Batterie) kann in einer anderen Klasse als Attribut dienen:
class Auto: def __init__(self, make, model, year): self.batterie = Batterie()
Die Methode einer Instanz von Auto könnte für die Batterie dann so lauten:
bmw1 = Auto() bmw1.batterie.methode()
Klassenmethoden
Klassenmethoden sind nicht an ein Objekt, sondern an eine Klasse gebunden. Im Gegensatz zu statischen Methoden arbeiten Klassenmethoden mit der Klasse, da sie als Parameter immer die Klasse selbst haben.
class Person: age = 25 def printAge(cls): print('The age is:', cls.age) # create printAge class method Person.printAge = classmethod(Person.printAge) Person.printAge()
Ausgabe:
The age is: 25
| |