Python: Klassen

Aus Flinkwiki
Version vom 12. Dezember 2020, 14:52 Uhr von Flinh1 (Diskussion | Beiträge) (super)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu: Navigation, Suche
Seitenübersicht
Zur Seite "Python"
Zur Seite "Python: Module"
Zur Seite "Python: Turtle"
Zur Seite "Python: Tkinter"
Zur Seite "Python: Pygame"
Zur Seite "Python: PyQT"
Zur Seite "Python: Anaconda"

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)

[2]


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

Programiz Python Programming


| |