Python: конвертировать скрипт из процедурного в стиль ООП

1

Я написал этот простой плагин Munin, чтобы рассчитать среднюю скорость вращения вентилятора, и я хочу переделать его в ООП - строго как учебное упражнение. Не знаю, с чего начать. Кто-то хочет предложить какое-то руководство или даже пример того, как должен выглядеть этот script, когда это будет сделано. Я буду использовать его для повтора некоторых других скриптов в стиле ООП; снова для учебных целей.

import sys
import subprocess

CMD = "/usr/sbin/omreport chassis fans".split()

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

if len(sys.argv) > 1:
    if sys.argv[1].lower() == "autoconfig":
        print "autoconfig"
    elif sys.argv[1].lower() == "config":
        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 "speed.label speed"
        print "speed.info Average fan speed for the five minutes."
else:
    try:
        data = subprocess.Popen(CMD,stdout=subprocess.PIPE).stdout.readlines()
    except OSError, e:
        print >> sys.stderr, "Error running '%s', %s" % (" ".join(cmd), e)
        sys.exit(1)

    count = total = 0
    for item in data:
        if "Reading" in item:
            # Extract variable length fan speed, without regex.
            total += int(item.split(":")[1].split()[0])
            count += 1
    # Sometimes omreport returns zero output if omsa services aren't started.
    if not count or not total:
        print >> sys.stderr, 'Error: "omreport chassis fans" returned 0 output.'
        print >> sys.stderr, 'OMSA running? Try: "srvadmin-services.sh status".'
        sys.exit(1)

    avg = (total / count)
    print "speed.value %s" % avg
  • 0
    Я объединил оба плагина в один ответ Леннарта Регебро. Буду очень признателен за некоторые предложения по этому. stackoverflow.com/questions/2191639/...
Теги:
oop

1 ответ

2
Лучший ответ

Вы переделаете его в ООП путем идентификации кода и данных, которые собираются вместе. Затем вы объединяетесь в "классы".

Фактические данные выше, по-видимому, являются результатом процесса. Код выполняет итерацию по нему. Я думаю, вы можете сделать класс из этого, если хотите, но это немного глупо.:)

Итак, что-то вроде этого (явно полностью непроверенный код):

import sys
import subprocess

class Fanspeed(object):

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

    def average_fan_speed(self):
        data = subprocess.Popen(CMD,stdout=subprocess.PIPE).stdout.readlines()

        count = total = 0
        for item in data:
            if "Reading" in item:
                # Extract variable length fan speed, without regex.
                total += int(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("I found no fans. Is OMSA services started?"

        avg = (total / count)
        return % avg

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

    if len(sys.argv) > 1:
        if sys.argv[1].lower() == "autoconfig":
            print "autoconfig"
        elif sys.argv[1].lower() == "config":
            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 "speed.label speed"
            print "speed.info Average fan speed for the five minutes."
    else:
        try:
            cmd = "/usr/sbin/omreport chassis fans"
            fanspeed = Fanspeed(cmd)
            average = fanspeed.average_fan_speed()
        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)

Но YMMV. Это, возможно, немного яснее.

  • 0
    Только с несколькими незначительными модификациями это работало отлично. Очень полезно увидеть сценарий, который я написал переделанным таким образом. Я знаю, что это, вероятно, не лучший вариант использования ООП, так что спасибо за игру. ;) У меня есть другой плагин, который невероятно похож, но для темпов шасси. Я собираюсь попытаться объединить их сейчас. Еще раз спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню