Python 3 Objektkonstruktion: Welches ist der Pythisch / der akzeptierte Weg?

8

Da ich einen Hintergrund in Java habe, der sehr ausführlich und streng ist, finde ich die Fähigkeit, Python-Objekte so zu verändern, dass sie andere Felder als die, die dem Konstruktor übergeben werden, wirklich "hässlich" nennen.

Ich versuche mich an eine pythonische Denkweise zu gewöhnen, Ich frage mich, wie ich meine Objekte konstruieren lassen soll .

Mein Instinkt ist, dass ich die Felder zur Bauzeit weitergeben muss, wie zum Beispiel:

%Vor%

Aber das kann übermäßig weitschweifig und verwirrend werden mit vielen Feldern, um zu bestehen. Um dies zu überwinden, gehe ich davon aus, dass die beste Methode darin besteht, ein Dictionary an den Konstruktor zu übergeben, von dem die Felder extrahiert werden. :

%Vor%

Der andere Mechanismus, den ich mir vorstellen kann, besteht darin, die Felder an anderer Stelle einzufügen , beispielsweise:

%Vor%

Aber wie sich das für mich zu locker anfühlt.

(Ich vermute, das Problem in meinem Kopf ist, wie ich mit Schnittstellen in Python umgehe ...)

Also, um die Frage zu wiederholen: Wie sollte ich meine Objekte in Python konstruieren? Gibt es eine akzeptierte Konvention?

    
Humphrey Bogart 28.02.2010, 23:34
quelle

2 Antworten

9

Das Erste, das Sie beschreiben, ist sehr häufig. Manche verwenden das kürzere

%Vor%

Ihr zweiter Ansatz ist nicht üblich, aber eine ähnliche Version ist dies:

%Vor%

ermöglicht das Erstellen von Objekten wie

%Vor%

Dies kann weiter zu

geändert werden %Vor%

erlaubt

%Vor%

Wie Debilski in den Kommentaren hervorhebt, ist die letzte Methode ein wenig unsicher. Sie können eine Liste der akzeptierten Parameter hinzufügen:

%Vor%

Es gibt viele Variationen, es gibt keinen gemeinsamen Standard, den ich kenne.

    
Otto Allmendinger 28.02.2010, 23:43
quelle
3

Ich habe nicht viele Ihrer field_map s im wirklichen Leben gesehen. Ich denke, das würde nur Sinn machen, wenn du das field_map auch an einer anderen Stelle in deinem Code verwendest.

Was Ihr drittes Beispiel betrifft: Obwohl Sie ihnen nicht zuweisen müssen (außer None ), ist es üblich, Attribute in der Methode __init__ explizit zu deklarieren, damit Sie leicht sehen können, welche Eigenschaften Ihr Objekt hat.

Das Folgende ist also besser, als einfach eine leere __init__ -Methode zu haben (Sie erhalten dafür auch einen höheren pylint -Wert):

%Vor%

Das Problem bei diesem Ansatz besteht darin, dass sich Ihr Objekt nach der Initialisierung in einem nicht gut definierten Zustand befindet, weil Sie noch nicht alle Eigenschaften Ihres Objekts definiert haben. Dies hängt von der Logik Ihres Objekts ab (Logik in Code und Bedeutung) und davon, wie Ihr Objekt funktioniert. Wenn es jedoch der Fall ist, würde ich Ihnen raten nicht dies auf diese Weise zu tun. Wenn Ihr Objekt davon abhängig ist, dass foo und bar sinnvoll definiert sind, sollten Sie wirklich in Ihre __init__ -Methode einfügen.

Wenn jedoch die Eigenschaften foo und bar nicht obligatorisch sind, können Sie sie später definieren.

Wenn die Lesbarkeit der Argumentlisten für Sie ein Problem darstellt: Verwenden Sie Schlüsselwortargumente.

    
Debilski 28.02.2010 23:45
quelle

Tags und Links