Python: Klassen: Unterschied zwischen den Versionen
Flinh1 (Diskussion | Beiträge) |
Flinh1 (Diskussion | Beiträge) (→super) |
||
(27 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
<div align="right"><big>'''[https://flinkwiki.de/index.php?title=Kategorie:Alle_Seiten Seitenübersicht]'''</big></div> | <div align="right"><big>'''[https://flinkwiki.de/index.php?title=Kategorie:Alle_Seiten Seitenübersicht]'''</big></div> | ||
<div align="right">'''[[Python|Zur Seite "Python"]]'''</div> | <div align="right">'''[[Python|Zur Seite "Python"]]'''</div> | ||
+ | <div align="right">'''[[Python: Module|Zur Seite "Python: Module"]]'''</div> | ||
<div align="right">'''[[Python: Turtle|Zur Seite "Python: Turtle"]]'''</div> | <div align="right">'''[[Python: Turtle|Zur Seite "Python: Turtle"]]'''</div> | ||
<div align="right">'''[[Python: Tkinter|Zur Seite "Python: Tkinter"]]'''</div> | <div align="right">'''[[Python: Tkinter|Zur Seite "Python: Tkinter"]]'''</div> | ||
− | <div align="right">'''[[Python: | + | <div align="right">'''[[Python: Pygame|Zur Seite "Python: Pygame"]]'''</div> |
− | <div align="right">'''[[Python: | + | <div align="right">'''[[Python: PyQT|Zur Seite "Python: PyQT"]]'''</div> |
+ | <div align="right">'''[[Python: Anaconda|Zur Seite "Python: Anaconda"]]'''</div> | ||
== Allgemeines == | == Allgemeines == | ||
+ | Beispiel für Klasse und ihre Instanziierung: | ||
+ | <nowiki> | ||
+ | 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()</nowiki> | ||
+ | |||
+ | ---- | ||
+ | == Besondere Methoden == | ||
+ | |||
+ | === __init__=== | ||
+ | |||
+ | Dient als Konstruktor. Wird automatisch aufgerufen, wenn ein Objekt erzeugt wird. | ||
+ | <nowiki> | ||
+ | class Auto: | ||
+ | def __init__(self,marke,farbe): | ||
+ | self.marke = marke | ||
+ | self.farbe = farbe | ||
+ | print(f"Neues Auto erzeugt, Marke: {self.marke}, Farbe: {self.farbe}.") | ||
+ | |||
+ | auto1 = Auto('Peugeot', "Silber") # Ausgabe: Neues Auto erzeugt, Marke: Peugeot, Farbe: Silber. | ||
+ | </nowiki> | ||
+ | |||
+ | ---- | ||
+ | === super() === | ||
+ | <nowiki> | ||
+ | class Parent: | ||
+ | def __init__(self, txt): | ||
+ | self.message = txt | ||
+ | |||
+ | def printmessage(self): | ||
+ | print(self.message) | ||
+ | |||
+ | class Child(Parent): | ||
+ | def __init__(self, txt): | ||
+ | super().__init__(txt) | ||
+ | |||
+ | x = Child("Hello, and welcome!") | ||
+ | |||
+ | x.printmessage()</nowiki>[https://www.w3schools.com/python/ref_func_super.asp] | ||
+ | |||
+ | Die Funktion ''super()'' gibt Zugriff auf die Methoden und Eigenschaften einer Eltern- oder Schwester-Klasse. | ||
+ | |||
+ | Die Funktion ''super()'' gibt ein Objekt zurück, das die Eltern-Klasse repräsentiert. | ||
+ | |||
+ | ---- | ||
+ | |||
+ | === __str__ === | ||
+ | <nowiki> | ||
+ | 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. | ||
+ | ( Ausgabe ohne __str__-Methode: <__main__.Auto object at 0x7fb2b541c9d0> ) | ||
+ | </nowiki> | ||
+ | |||
+ | ---- | ||
+ | == __slots__ == | ||
+ | |||
+ | Die Klassendirektive ''__slots__'' schränkt die Attribute der Instanzen einer Klasse bei der Klassendefinition ein. | ||
+ | <nowiki> | ||
+ | >>> class A: | ||
+ | ... __slots__ = ('x','y') | ||
+ | ... def __init__(self): | ||
+ | ... self.x = 1 | ||
+ | ... self.y = 2 | ||
+ | ... | ||
+ | >>> a = A() | ||
+ | >>> a.x | ||
+ | 1 | ||
+ | >>> a.y | ||
+ | 2 | ||
+ | >>> a.x = 5 | ||
+ | >>> a.x | ||
+ | 5 | ||
+ | >>> a.z = 4 | ||
+ | Traceback (most recent call last): | ||
+ | File "<stdin>", line 1, in <module> | ||
+ | AttributeError: 'A' object has no attribute 'z' | ||
+ | >>> | ||
+ | </nowiki>Außer den Attributen 'x' und 'y' sind hier keine weiteren erlaubt. | ||
+ | |||
+ | ---- | ||
+ | |||
+ | == 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). | ||
+ | <nowiki> | ||
+ | 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) | ||
+ | </nowiki> | ||
+ | |||
+ | == Statische Methoden == | ||
+ | |||
+ | Statische Methoden greifen auf Klassenattribute, nicht auf Instanzenattribute zu. Dabei dient <code>@staticmethod</code> als ''function decorator''. Damit wird die statische Methode an die Klasse gebunden, die somit keinen Bezug zu den Instanzen hat. Wenn man <code>@staticmethod</code> weglässt, kann die statische Methode zwar noch über den Klassennamen, aber nicht mehr über den Namen der Instanz aufgerufen werden. | ||
+ | <nowiki> | ||
+ | # 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("") | ||
+ | </nowiki>[https://www.hanser-fachbuch.de/buch/Python+3+Einsteigen+und+Durchstarten/9783446454699 Kalista S. 149] | ||
+ | |||
+ | Alternativ zu <code>@staticmethod</code>: | ||
+ | zeige_statistik = staticmethod(zeige_statistik) | ||
+ | [https://www.programiz.com/python-programming/methods/built-in/staticmethod] | ||
+ | |||
+ | ---- | ||
+ | |||
+ | == Vererbung == | ||
+ | |||
+ | === Grundschema === | ||
+ | <nowiki> | ||
+ | class Elektroauto(Auto): | ||
+ | def __init__(self, make, model, year): | ||
+ | super().__init__(make, model,year) | ||
+ | </nowiki> | ||
+ | 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: | ||
+ | <nowiki> | ||
+ | class Auto: | ||
+ | def __init__(self, make, model, year): | ||
+ | self.batterie = Batterie() | ||
+ | </nowiki> | ||
+ | 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. | |
+ | <nowiki> | ||
+ | class Person: | ||
+ | age = 25 | ||
+ | def printAge(cls): | ||
+ | print('The age is:', cls.age) | ||
+ | # create printAge class method | ||
+ | Person.printAge = classmethod(Person.printAge) | ||
+ | |||
+ | Person.printAge() | ||
+ | </nowiki> | ||
+ | Ausgabe: | ||
+ | The age is: 25 | ||
+ | [https://www.programiz.com/python-programming/methods/built-in/classmethod Programiz Python Programming] | ||
---- | ---- | ||
+ | |||
[[Kategorie: Alle Seiten]] | [[Kategorie: Programmierung ]] | | [[Kategorie: Alle Seiten]] | [[Kategorie: Programmierung ]] | |
Aktuelle Version vom 12. Dezember 2020, 14:52 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. Wird automatisch aufgerufen, wenn ein Objekt erzeugt wird.
class Auto: def __init__(self,marke,farbe): self.marke = marke self.farbe = farbe print(f"Neues Auto erzeugt, Marke: {self.marke}, Farbe: {self.farbe}.") auto1 = Auto('Peugeot', "Silber") # Ausgabe: Neues Auto erzeugt, Marke: Peugeot, Farbe: Silber.
super()
class Parent: def __init__(self, txt): self.message = txt def printmessage(self): print(self.message) class Child(Parent): def __init__(self, txt): super().__init__(txt) x = Child("Hello, and welcome!") x.printmessage()[1]
Die Funktion super() gibt Zugriff auf die Methoden und Eigenschaften einer Eltern- oder Schwester-Klasse.
Die Funktion super() gibt ein Objekt zurück, das die Eltern-Klasse repräsentiert.
__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. ( Ausgabe ohne __str__-Methode: <__main__.Auto object at 0x7fb2b541c9d0> )
__slots__
Die Klassendirektive __slots__ schränkt die Attribute der Instanzen einer Klasse bei der Klassendefinition ein.
>>> class A: ... __slots__ = ('x','y') ... def __init__(self): ... self.x = 1 ... self.y = 2 ... >>> a = A() >>> a.x 1 >>> a.y 2 >>> a.x = 5 >>> a.x 5 >>> a.z = 4 Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'A' object has no attribute 'z' >>> Außer den Attributen 'x' und 'y' sind hier keine weiteren erlaubt.
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
| |