2017-10-04 17 views
0

태양 전지 패널 (시스템/컨테이너) 클러스터 시뮬레이션입니다. 이 클러스터의 속성은 요소 (패널 (하위 시스템/포함))의 속성에 클러스터 당 요소 수를 통해 거의 일대일로 연결됩니다. 예 : 클러스터의 에너지 생산은 단순히 클러스터의 패널 수와 단일 클러스터의 생산 시간입니다. 비용, 무게 등 동일합니다. 내 질문은 포함 된 클래스에 컨테이너 클래스를 연결하는 방법입니다. 하나의 예를 들어 작성합니다이 순진하게 접근 방식,컨테이너 클래스 속성을 포함 된 클래스 속성에 연결합니다.

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

는 예를 들면, 당신의 코드를 파이썬 문제가 있습니다 :

  • yield 파이썬에서 특정 뭔가, 아마 좋은 식별자를 의미

그리고 철자 :

  • 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

파이썬에 오신 것을 환영합니다. 파이썬 프롬프트에서'import this '를 시도해보십시오. :-) – thebjorn

+0

상속을 포함하는이 솔루션은 제가 제시 한 첫 번째 예제와 비슷할 것이라고 생각합니다 : 여러분은 (대부분) 맵핑 아웃. 그렇게하는 것이 타당한 적절한 방법입니다. 나는 대체 솔루션에 대해 아직도 궁금합니다. – balletpiraat