Python: отзывы / исправления по первому сценарию в стиле ООП - PullRequest
2 голосов
/ 03 февраля 2010

Я хотел бы получить отзыв о моем первом скрипте Python, который использует стиль ООП.Это плагин Munin, который отображает среднюю скорость вентилятора или среднюю температуру шасси в зависимости от названия плагина (dell_fans, dell_temps).

Примерно час назад я представил процедурную версию изплагин скорости вентилятора к stackoverflow, чтобы получить помощь в преобразовании его в стиль ООП.Затем я построил это, чтобы объединить два сценария.Любые отзывы, предложения, исправления будут очень полезны.Я хотел бы исправить любые заблуждения, которые у меня могут возникнуть до того, как они укрепятся.

Обновление : изменено, чтобы иметь общий базовый класс.Любые другие предложения?

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)

Ответы [ 3 ]

2 голосов
/ 03 февраля 2010

Является ли Temps a FanSpeed? Это лакмусовая бумажка для уместности подкласса (например, слон - это животное, автомобиль - не животное), поэтому может быть целесообразно иметь подкласс Animal, который моделирует слона, но не подкласс Animal какие модели автомобиля).

Похоже, они моделируют две разные вещи - так что да, создайте для них общий базовый класс.

1 голос
/ 03 февраля 2010

Мне кажется, у вас есть два вида статистики, которую вы хотите смоделировать: скорость вращения вентилятора (Fanspeed) и температура (Temps). Если есть некоторые общие функции, которыми вы хотите поделиться между ними, создайте для них общий базовый класс, назовем его, например, Statistic.

class Statistic(object):
    def average(self):
        pass # your logic to calculate the average here

class Fanspeed(Statistic):
    pass # your fan speed functionaly here

class Temps(Statistic):
    pass # your temperature functionaly here
1 голос
/ 03 февраля 2010

Самим более подходящим способом было бы определить один основной класс (например, FanStatistics или как вы хотите его вызывать), в котором вы определяете общие методы, такие как метод average, и подкласс его в FanSpeed и FanTemp. Таким образом, вы не перепутаете названия, поскольку температура не является подклассом или специализацией скорости, но скорость и температура являются специализациями данных абстрактной статистики.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...