Python-API-Entwurfsmusterfrage

9

Ich finde oft, dass ich Klasseninstanzen habe, die von anderen Klasseninstanzen in einer Baumstruktur abstammen. Zum Beispiel, ich mache eine CMS-Plattform in Python. Ich könnte ein Reich haben und darunter einen Blog und darunter eine Post. Jeder Konstruktor verwendet seinen übergeordneten Parameter als ersten Parameter, damit er weiß, wozu er gehört. Es könnte so aussehen:

%Vor%

Normalerweise füge ich der übergeordneten Klasse eine create-Methode hinzu, sodass die Verknüpfung etwas automatischer ist. Meine Realm-Klasse könnte so aussehen:

%Vor%

Damit kann der Benutzer der API nicht jedes einzelne Modul importieren, nur das oberste. Es könnte sein wie:

%Vor%

Das Problem ist, diese create-Methoden sind redundant und ich muss die gleichen Parameter an zwei Stellen pydoc.

Ich frage mich, ob es ein Muster gibt (vielleicht mit Metaklassen), um eine Klasseninstanz mit einer Elternklasseninstanz zu verknüpfen. Irgendwie könnte ich Code wie diesen aufrufen und dem Blog mitteilen, worum es sich bei dem übergeordneten Bereich handelt:

%Vor%     
jpsimons 05.03.2011, 18:13
quelle

2 Antworten

1

Sie könnten eine gemeinsame Basisklasse für die Container verwenden, die eine add() -Methode enthalten

%Vor%

und den Parameter parent in den abgeleiteten Klassen optional machen

%Vor%

Ihr Code oben würde jetzt

lesen %Vor%

Sie würden keine create...() -Methoden mehr haben, also brauchen Sie nichts zweimal zu dokumentieren.

Wenn das Festlegen des übergeordneten Elements mehr als nur das Ändern des Attributs parent erfordert, können Sie eine Eigenschaft oder eine Setter-Methode verwenden.

BEARBEITEN : Wie Sie in den Kommentaren unten gesagt haben, sollten die Kinder am Ende des Konstruktors an die Eltern gebunden sein. Der obige Ansatz kann modifiziert werden, um dies zu unterstützen:

%Vor%     
Sven Marnach 05.03.2011, 19:01
quelle
0

Was ist mit so etwas, nur Unterklassenbildung? In meinem Realm-Konstruktor:

%Vor%

Scheint zu funktionieren. Und es könnte mit Basisklassen oder Meta-Klassen verallgemeinert werden.

    
jpsimons 05.03.2011 19:39
quelle

Tags und Links