Parameter an den Basisklassenkonstruktor übergeben oder Instanzvariable verwenden?

8

Alle von einer bestimmten Basisklasse abgeleiteten Klassen müssen ein Attribut namens "path" definieren. Im Sinne der Ente-Typisierung konnte ich mich auf die Definition in den Unterklassen verlassen:

%Vor%

Eine andere Möglichkeit wäre, den Basisklassenkonstruktor zu verwenden:

%Vor%

Ich benutze Python 3.1.

Was würden Sie bevorzugen und warum? Gibt es einen besseren Weg?

    
deamon 28.04.2010, 09:48
quelle

1 Antwort

11

In Python 3.0 +:
Ich würde mit einem Parameter zum Konstruktor der Basisklasse gehen, wie Sie im zweiten Beispiel haben. Dadurch werden Klassen erzwungen, die von Base abgeleitet sind, um die erforderliche Pfadeigenschaft bereitzustellen, die die Tatsache dokumentiert, dass die Klasse eine solche Eigenschaft aufweist und dass abgeleitete Klassen diese bereitstellen müssen. Ohne es würden Sie sich darauf verlassen, dass dies irgendwo in den Docstrings Ihrer Klasse angegeben (und gelesen) wird, obwohl es sicherlich hilft, auch im Docstring anzugeben, was die bestimmte Eigenschaft bedeutet.

In Python 2.6 +:
Ich würde keines der oben genannten verwenden; stattdessen würde ich verwenden:

%Vor%

Mit anderen Worten, ich würde einen solchen Parameter im Konstruktor der Basisklasse benötigen, weil er die Tatsache dokumentiert, dass alle diese Typen diesen bestimmten Parameter haben / verwenden / brauchen und dass der Parameter bereitgestellt werden muss. Allerdings würde ich super () nicht als Super ist etwas fragil und gefährlich in Python , und Ich würde Base auch zu einer Klasse für neue Stile machen, indem ich von der Klasse object (oder von einer anderen neuen Klasse) erben würde.

    
Michael Aaron Safyan 28.04.2010 09:56
quelle