OOP in Python: Method Overriding und Overloading

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
krisjugisto
User
Beiträge: 4
Registriert: Freitag 26. April 2013, 09:50

Hallo miteinander,

ich habe mich nach Jahren, in denen ich mich mit vergleichsweise plumpen Skriptsprachen über Wasser gehalten habe, beschlossen, voll auf Python zu setzen, um nun auch Programmieren systematisch zu lernen. Dabei ist Python für mich insofern als OOP-unterstützende Sprache Neuland. Ich habe mich weitgehend in die Theorie von OOP eingelesen, weiß also, mit der Notwendigkeit der Abstraktion, Vererbung und Polymorphie etwas anzufangen. Nun bin ich aber auf der Suche nach Tutorials oder Beispielprojekten, anhand derer ich 'method overriding' oder 'method overloading' besser und vor allem an praktischen Anwendungsfällen studieren kann.

Könnt ihr mich eventuell in die richtige Richtung schubsen. Danke!

Grüße

kris
BlackJack

@krisjugisto: Overloading gibt es in Python nicht. Es gibt ja keine Typsignaturen bei Funktionen/Methoden bei dynamisch typisierten Sprachen, also auch keine Möglichkeit anhand der Typsignatur die richtige Funktion/Methode heraus zu suchen. Und Namen müssen innerhalb eines Namensraums in Python eindeutig sein. Oder anders ausgedrückt, man kann zu einem gegebenen Zeitpunkt an *einen* Namen nur *ein* Objekt binden.

Overriding kommt in Python auch gar nicht so häufig vor, weil durch das „duck typing” nicht so oft Klassenhierarchien entstehen müssen wie in statisch typisierten Programmiersprachen.
krisjugisto
User
Beiträge: 4
Registriert: Freitag 26. April 2013, 09:50

@BlackJack: Danke für die Hinweise. Das erklärt einiges, mein Lehrbuch zu OOP springt an den Stellen zu Overloading und Overriding immer auf Java oder andere statisch-typisierte Sprachen um. :wink:

@all: In dem Fall ändere ich meine Frage etwas um, dass ich aber gerne noch Hinweise zu gut strukturierten Beispielen für sauber umgesetztes OOP in Real-Life-Projekten annehme. Einfach damit ich ein Gefühl dafür kriege. Danke.
xeike
User
Beiträge: 83
Registriert: Donnerstag 28. Februar 2013, 09:58

Mir haben beim Üben mit diesen Sachen durchaus an den Haaren herbeigezogene Übungen sehr geholfen. Tatsächlich gebraucht habe ich nur wenig davon.

Hier mal etwas, was ich geschrieben habe, um ein paar Sachen (Implementation, Ausnahmen) gekürzt:

Code: Alles auswählen

class Vektor:
    def __init__(self, x, y, z):
        pass

      def __mul__(self, arg):
          if isinstance(arg, (int)):
              print( "multipliziere int" )
          elif isinstance(arg, (Vektor)):
              print("multipliziere Vektor")
          else:
             print("mache nix")
Die Typensignatur habe ich mir über isinstance() "geholt", also eher konkret verglichen.

Um einfach mal ein Gefühl dafür zu bekommen, könntest du eine Klasse Matrix implementieren und den Gauß'schen Algorithmus, wobei du dabei ja Vielfache von Zeilenvektoren zu anderen Zeilenvektoren addieren musst. All das gibt es natürlich auch schon, aber als Übung ist das nicht zu verachten, finde ich.

Dann natürlich auch noch Übungen mit vorhandenen Klassen, hier bietet sich PyQt an. Das ist ein recht großes System von ineinander verzahnten Klassen. Kapselung und Vererbung braucht man dort wirklich, das Überschreiben von Methoden seltener, aber auch.

Xe
krisjugisto
User
Beiträge: 4
Registriert: Freitag 26. April 2013, 09:50

@xeike: Danke für Tipps.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

@xeike: Deine Tupel die du da bei ``isinstance`` hast sind gar keine Tupel. Da würde ich dann entweder echte Tupel draus machen oder die Klammern weglassen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten