Frage

Klassenhierarchien und Konstrukteure sind verwandt. Parameter aus einer untergeordneten Klasse müssen ihre Eltern übergeben werden.

Also, in Python, haben wir am Ende mit etwas wie folgt auf:

class Parent(object):
    def __init__(self, a, b, c, ka=None, kb=None, kc=None):
        # do something with a, b, c, ka, kb, kc

class Child(Parent):
    def __init__(self, a, b, c, d, e, f, ka=None, kb=None, kc=None, kd=None, ke=None, kf=None):
        super(Child, self).__init__(a, b, c, ka=ka, kb=kb, kc=kc)
        # do something with d, e, f, kd, ke, kf

Stellen Sie sich mit einem Dutzend Kind Klassen und viele Parameter. Hinzufügen neuer Parameter wird sehr mühsam.

Natürlich kann man vollständig mit dem Namen Parameter verzichten und * args verwenden und ** kwargs, aber das macht die Methode Erklärungen zweideutig.

Gibt es ein Muster für elegant mit diesem in Python zu tun (2.6)?

Mit dem „elegant“ Ich meine, ich mag die Anzahl, wie oft die Parameter erscheinen reduzieren. a, b, c, ka, kb, kc alle erscheinen 3 mal: im Kinder Konstruktor in der super () aufrufen, um Eltern, und in der übergeordneten Konstruktor

.

Im Idealfall würde Ich mag die Parameter angeben, für Eltern init einmal, und in Kindern init nur die zusätzlichen Parameter angeben.

Ich möchte etwas tun:

class Parent(object):
    def __init__(self, a, b, c, ka=None, kb=None, kc=None):
        print 'Parent: ', a, b, c, ka, kb, kc

class Child(Parent):
    def __init__(self, d, e, f, kd='d', ke='e', kf='f', *args, **kwargs):
        super(Child, self).__init__(*args, **kwargs)
        print 'Child: ', d, e, f, kd, ke, kf

x = Child(1, 2, 3, 4, 5, 6, ka='a', kb='b', kc='c', kd='d', ke='e', kf='f')

Das funktioniert leider nicht, da 4, 5, 6 Ende bis zu kd zugewiesen, ke, kf.

Gibt es ein eleganten Python-Muster, die oben für die Erfüllung?

War es hilfreich?

Lösung

„Dutzende Kind Klassen und viele Parameter“ klingen wie ein Problem, unabhängig von Parametern Namensgebung.

Ich vermute, dass ein wenig Refactoring einig schält heraus kann Strategie Objekte, die diese Hierarchie vereinfachen würden und die super-komplexe Konstrukteuren weggehen.

Andere Tipps

Nun, die einzige Lösung, die ich sehen konnte, eine Mischung aus aufgelisteten Variablen verwendet sowie * args und ** kwargs, wie zum Beispiel:

class Parent(object):
    def __init__(self, a, b, c, ka=None, kb=None, kc=None):
        pass

class Child(Parent):
    def __init__(self, d, e, f, *args, kd=None, ke=None, kf=None, **kwargs):
        Parent.__init__(self, *args, **kwargs)
        pass

Auf diese Weise können Sie sehen, welche Parameter von jedem der Klassen erforderlich sind, aber ohne sie erneut eingeben.

Eine Sache zu beachten ist, dass Sie Ihre gewünschte Bestellung verlieren (a, b, c, d, e, f), wie es wird (d, e, f, a, b, c). Ich bin mir nicht sicher, ob es einen Weg gibt, um die * args vor den anderen nicht benannte Parameter zu haben.

Ich versuche, die Parameter in ihre eigenen Objekte zu gruppieren, beispiels anstelle des Führens Quellverzeichnis, das Zielverzeichnis, temporaryDirectory, -serverName, serverport, würde ich ein Directory und Servercontext-Objekte.

Wenn der Kontext-Objekte starten mehr mit Verhalten oder Logik könnte es hier erwähnt auf die Strategie Objekte in führen.

scroll top