2017-10-04 4 views
0

Ich arbeite an einer Simulation eines Clusters von Sonnenkollektoren (ein System/Container). Die Eigenschaften dieses Clusters sind fast eins zu eins mit den Eigenschaften der Elemente - den Panels (Subsystem/enthalten) - über die Anzahl der Elemente pro Cluster verknüpft. Z.B. Die Energieproduktion des Clusters ist einfach die Anzahl der Panels im Cluster mal die Produktion des einzelnen Clusters. Gleiches gilt für die Kosten, das Gewicht usw. Meine Frage ist, wie die Container-Klasse mit der enthaltenen Klasse verknüpft wird.Verknüpfen von Container-Klasseneigenschaften mit enthaltenen Klasseneigenschaften

Lassen Sie mich mit einem naiven Beispiel Ansatz verdeutlichen:

class PanelA(BasePanel): 
    ... _x,_y,_area,_production,etc. 

    @property 
    def production(self): 
     # J/panel/s 
     return self._area * self._efficiency 

    ... and 20 similar properties 

    @property 
    def _technical_detail 

class PanelB(BasePanel): 
    .... similar 

class PanelCluster(): 
    ....   
    self.panel = PanelA() 
    self.density = 100 # panels/ha 

    @property 
    def production(self): 
     # J/ha/h 

     uc = 60*60 # unit conversion 
     rho = self.density 
     production_single_panel = self.panel.production 

     return uc*rho*production_single_panel 

    ... and e.g. 20 similar constructions 

Hinweis, in diesem naiven Ansatz ein Beispiel schreiben würde 20 solche Methoden, die nicht diesem DRY-Prinzip entsprechen.

Was wäre eine bessere Alternative? (Ab) Verwenden Sie getattr?

Zum Beispiel?

Dies scheint bereits mehr "programmatisch", aber vielleicht naiv - wieder. Also frage ich mich, was sind die Optionen und die Vor-/Nachteile davon?

Antwort

1

Es gibt eine Reihe von Python Probleme mit Ihrem Code, zB:

  • yield bedeutet etwas Bestimmtes in Python, wahrscheinlich nicht eine gute Kennung

und es ist geschrieben:

  • hasattr (self.panel.unit, Schlüssel)
  • getattr (self.panel, Schlüssel)

Abgesehen davon, suchen Sie wahrscheinlich nach einer Lösung mit Vererbung. Vielleicht müssen sowohl Panel als auch PanelCluster von einer PanelFunction Klasse geerbt werden?

class PanelFunctions(object): 
    @property 
    def Yield(...): 
     ... 

class Panel(PanelFunctions): 
    .. 

class PanelCluster(PanelFunctions): 
    .. 

würde ich die Eigenschaften als separte Definitionen verlassen, da Sie Unit-Tests für alle von ihnen zu schreiben brauchen (und es wird viel leichter sein, Abdeckung, die Art und Weise zu bestimmen).

+0

Danke - Ich habe diese Sprachfehler behoben: Sie können mir sagen, dass ich neu bin. – balletpiraat

+0

Willkommen bei Python. Wenn Sie dies noch nicht getan haben, versuchen Sie 'import this' an einer Python-Eingabeaufforderung .. :-) – thebjorn

+0

Ich denke, diese Lösung mit Vererbung würde ähnlich wie das erste Beispiel aussehen, das ich gebe: Sie schreiben (die meisten) alle von die Mappings heraus. Was ist ein expliziter richtiger Weg dazu. Ich bin immer noch neugierig auf alternative Lösungen. – balletpiraat