[Vererbung] Erweiterung einer Klasse der Standardlib

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
losgehts
User
Beiträge: 19
Registriert: Montag 8. Juni 2009, 01:00

Hallo allerseits,

ich erweitere gerade das erste Mal eine Klasse der Standardbibliothek und scheitere schon ganz zu Beginn. Vorweg: ich benutze Python 3.4

Mein Code

Code: Alles auswählen

import shlex
class shlexfem(shlex):
    def __init__(self, instream=None, infile=None, posix=False):
        super().__init__(instream, infile, posix)
        pass
dieser wirft in Zeile 2 folgenden Fehler aus:

Code: Alles auswählen

TypeError: module.__init__() takes at most 2 arguments (3 given)
Mir ist nicht klar, dass ich in Zeile 2 drei Argumente übergebe? Woher weiß ich, dass das Modul 2 maximal 3 Argumente annimmt (wenn ich es nicht erst von der Fehlermeldung erfahren will) und welche das sind?
Ich habe nur die __init__() der Klasse shlex gefunden, und will ja diese auch mit meiner Codezeile 4 aufrufen:

Code: Alles auswählen

class shlex:
    "A lexical analyzer class for simple shell-like syntaxes."
    def __init__(self, instream=None, infile=None, posix=False):
        ...
Die Fehlermeldung kann sich aber doch nicht auf die __init__() der Klasse shlex beziehen, denn die hat ja 4 Argumente.

Ihr bemerkt, ich habe Verständnisprobleme: was macht ein Modul mit Argumenten, ich dachte, die Argumente kommen erst bei der __init__()-Methode ins Spiel?
Mir scheint, als ob ich den Unterschied zwischen Modul und Klasse noch nicht verstanden habe, denn in meinen kleinen Tests (zwei Klassen in einer Datei) stoße ich auf dieses Problem nicht, bzw. kann es nicht provozieren (z.B. mit zu vielen Argumenten, das ergibt eine etwas andere Fehlermeldung).
Weiß jemand, wo ich mich diesbezüglich schlau machen kann, ich habe für dieses Problem nichts gefunden?

Kurz fragen möchte ich noch was den Aufruf der __init__() der Basisklasse betrifft: Welche Schreibweise ist die "bessere", "pythonischere", oder ist eine falsch:

Code: Alles auswählen

        super().__init__(instream, infile, posix)
        # oder
        shlex.__init__(self, instream, infile, posix)
Vielen Dank für Eure Hilfe!

Viele Grüße,
Ulrich
losgehts
User
Beiträge: 19
Registriert: Montag 8. Juni 2009, 01:00

Hallo,

:embrassed:
sorry, nach der Fehlermeldung kann man ja auch mal googeln, wieso ich nur nicht auf die Idee gekommen bin?!

Es liegt am Import: ich habe das nun so verstanden, das ich nicht die Klasse, sondern das Modul importiert habe. Nun habe ich meinen Code geändert:

Code: Alles auswählen

from shlex import shlex
class shlexfem(shlex):
    def __init__(self, instream=None, infile=None, posix=False):
        super().__init__(instream, infile, posix)
Damit hat sich die Fehlermeldung erledigt. Ob der Code das tut, was ich will, muss ich erst noch herausfinden.

Die Frage ob eine Formulierung der beiden Ausdrücke

Code: Alles auswählen

        super().__init__(instream, infile, posix)
        # oder
        shlex.__init__(self, instream, infile, posix)
Vor- / Nachteile hat interessiert ist für mich noch offen.

Grüße, Ulrich
losgehts
User
Beiträge: 19
Registriert: Montag 8. Juni 2009, 01:00

Hallo BlackJack,

vielen Dank!
Ich habe die Ausführung gelesen und bin zu dem Schluss gekommen, dass ich zunächst kein super() verwende, bis ich auf Fehler stoße (und das wird vermutlich dauern ...) .

Viele Grüße und ein schönes Wochenende,
Ulrich
Antworten