2017-10-04 9 views
0

私は、太陽電池パネルのクラスタ(システム/コンテナ)のシミュレーションを行っています。このクラスターのプロパティーは、クラスターごとの要素数を介して、要素(パネル(サブシステム/含まれている))のプロパティーにほぼ1対1でリンクされています。例えば。クラスタのエネルギー生産は、単にクラスタ内のパネルの数と単一のクラスタの生産との間の数である。コスト、重量などと同じです。私の質問は、コンテナクラスと含まれるクラスをリンクする方法です。 1は、例えば記述し、この単純なアプローチでは、コンテナのクラスプロパティを含むクラスプロパティにリンクする

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 

注:

私は単純な手法例で説明しましょうこのDRY原理に合致していないような20の方法。

もっと良い選択肢は何ですか? (Ab)getattrを使用しますか?

たとえば、

class Panel(): 
    unit = {'production':'J/panel/s'} 

class PanelCluster(): 
    panel = Panel() 

    def __getattr__(self,key): 

     if self.panel.__hasattr__(key) 
      panel_unit = self.panel.unit[key] 

      if '/panel/s' in panel_unit: 

       uc = 60*60 # unit conversion 
       rho = self.density 
       value_per_panel = getattr(self.panel,key) 

       return uc*rho*value_per_panel 
      else: 
       return getattr(self.panel,key) 

これはすでに「プログラマティック」に見えますが、これもまたナイーブかもしれません。だから私はオプションと賛否両論は何ですか?

答えて

1

あなたのコードを持つPythonの問題の数は例えば、あります

  • yieldはPythonで特定の何か、おそらくない良い識別子

を意味し、それが綴られています:

  • hasattr(self.panel.unit、key)
  • getattr(self.panel、key)

それを除いて、おそらくあなたは継承を含む解決策を探しているでしょう。おそらくPanelPanelClusterの両方がPanelFunctionクラスから継承する必要がありますか?

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

class Panel(PanelFunctions): 
    .. 

class PanelCluster(PanelFunctions): 
    .. 

あなたがそれらのすべてのユニットテストを書く必要がありますので、私はseparteの定義としての性質を残して(そしてカバレッジの方法を決定する方がはるかに簡単になります)。

+0

ありがとうございます - 私はこれらの言語エラーを修正しました。あなたはこれを初めて知っていると言えるでしょう。 – balletpiraat

+0

Pythonへようこそ。まだ完成していないのなら、Pythonプロンプトで 'import this'を試してみてください。:-) – thebjorn

+0

私はこの継承に関する解決法は、私が与える最初の例と似ていると思います。マッピングが外に出る。これは明示的に正しい方法です。私はまだ別の解決策に興味があります。 – balletpiraat

関連する問題