2010-02-03 2 views
2

OOP 스타일을 사용하는 첫 번째 Python 스크립트에 대한 피드백을 보내고 싶습니다. 이것은 플러그인 이름 (dell_fans, dell_temps)에 따라 평균 팬 속도 또는 평균 섀시 온도를 그래프로 보여주는 Munin 플러그인입니다.Python : 첫 번째 OOP 스타일 스크립트에 대한 피드백/수정

몇 시간 전 OOB 스타일로 변환하는 데 도움이되는 stackoverflow에 팬 속도 플러그인의 I submitted a procedural version이 있습니다. 그런 다음 두 스크립트를 결합하여 구축했습니다. 의견, 제안, 수정 사항은 매우 유용합니다. 나는 그들이 시멘트를 만들기 전에 내가 가지고있는 오해를 시정하고 싶다.

업데이트 : 수정 된 공통 기본 클래스. 다른 제안?

import sys 
import subprocess 

class Statistics(object): 

    def __init__(self, command): 
     self.command = command.split() 

    def average(self): 
     data = subprocess.Popen(self.command,stdout=subprocess.PIPE).stdout.readlines() 

     count = total = 0 
     for item in data: 
      if "Reading" in item: 
       # Extract variable length fan speed, without regex. 
       total += float(item.split(":")[1].split()[0]) 
       count += 1 
     # Sometimes omreport returns zero output if omsa services aren't started. 
     if not count or not total: 
      raise ValueError("No output from omreport. Is OMSA services started?") 

     avg = (total/count) 
     return avg 

    def print_autoconfig(self): 
     print "autoconfig goes here" 


class Fanspeed(Statistics): 

    def __init__(self, command): 
     Statistics.__init__(self, command) 

    def print_config(self): 
     print "graph_title Average Fan Speed" 
     print "graph_args --base 1000 -l 0" 
     print "graph_vlabel speed (RPM)" 
     print "graph_category Chassis" 
     print "graph_info This graph shows the average speed of all fans" 
     print "graph_period second" 
     print "data.label speed" 
     print "data.info Average fan speed for the five minutes." 


class Temps(Statistics): 

    def __init__(self, command): 
     Statistics.__init__(self, command) 

    def print_config(self): 
     print "graph_title Average Temperature" 
     print "graph_args --upper-limit 120 -l 0" 
     print "graph_vlabel Celsius" 
     print "graph_category Chassis" 
     print "graph_info This graph shows the avg temp of all sensors." 
     print "graph_period second" 
     print "data.label temp" 
     print "data.info Average chassis temperature for the five minutes." 


if __name__ == '__main__': 
    # Munin populates sys.argv[1] with "" (an empty argument), lets remove it. 
    sys.argv = [x for x in sys.argv if x] 

    if "fans" in sys.argv[0]: 
     cmd = "/usr/sbin/omreport chassis fans" 
     omdata = Fanspeed(cmd) 
    elif "temps" in sys.argv[0]: 
     cmd = "/usr/sbin/omreport chassis temps" 
     omdata = Temps(cmd) 
    else: 
     print >> sys.stderr, "Change filename to dell_fans or dell_temps." 
     sys.exit(1) 

    if len(sys.argv) > 1: 
     if sys.argv[1].lower() == "autoconfig": 
      omdata.print_autoconfig() 
     elif sys.argv[1].lower() == "config": 
      omdata.print_config() 
    else: 
     try: 
      average = omdata.average() 
      print "data.value %s" % average 
     except OSError, e: 
      print >> sys.stderr, "Error running '%s', %s" % (cmd, e) 
      sys.exit(1) 
     except ValueError, e: 
      # Sometimes omreport returns zero output if omsa services aren't started. 
      print >> sys.stderr, 'Error: "omreport chassis fans" returned 0 output.' 
      print >> sys.stderr, 'OMSA running? Try: "srvadmin-services.sh status".' 
      sys.exit(1) 
+0

여러분 모두, 그리고이 사이트는 저 같은 초보자에게 귀중한 자료입니다. – CarpeNoctem

답변

2

TempsFanSpeed? 그것은 서브 클래 싱이 적절한 지 여부에 대한 리트머스 테스트입니다 (예 : 코끼리가 동물이고 자동차가 동물이 아닙니다). Animal의 하위 클래스가 코끼리를 모델링하는 것이 적절할 수 있지만 Animal의 하위 클래스는 아닙니다.).

두 모델을 모델링하는 것처럼 들리 - 그렇습니다. 공통 기본 클래스를 만듭니다.

+0

알았어, 나는 공통 기본 클래스를 만들 것이다. 다른 제안? – CarpeNoctem

1

sematically 더 적절한 방법은 하나 개의 메인 클래스를 정의하는 것 (예를 들어, FanStatistics 또는 당신은 전화를 원하는), 여기에서는 일반적인 방법을 정의의 average 방법 및 FanSpeedFanTemp에 서브 클래스를 같은 . 온도가 서브 클래스 나 속도의 전문화가 아니기 때문에 이름을 혼동하지 않을 것입니다. 속도와 온도는 둘 다 추상 통계 데이터의 전문화입니다.

1

팬 속도 (Fanspeed)와 체감 온도 (Temps)의 두 가지 종류의 통계를 작성하는 것처럼 들리 네요. 공유 할 공통 기능이있는 경우 공통 기본 클래스를 작성하여 예를 들어 Statistic으로 호출 할 수 있습니다.

+0

감사합니다. 공통 기본 클래스를 사용하는 스크립트를 업데이트했습니다. 당신이 본 다른 것? – CarpeNoctem

관련 문제