Классы для группировки некоторых действий в Python - PullRequest
1 голос
/ 25 января 2012

Я пишу конфигурационную программу для своего собственного дистрибутива Linux.Конфигурация разбита на разделы: general, networking, session, etc. - в которой группируются похожие параметры.Например, в общем разделе есть параметры компьютера name, description, workgroup, language.

Я думаю, что каждый раздел должен быть представлен классом, и каждый параметр должен иметь соответствующее свойство (getter и, возможно, setter).

Более того, было бы неплохо обобщить, если бы была функция для проверки, включена ли данная опция (т. Е. Если система удовлетворяет требованиям для этой опции), например:

class General(object):

     @property
     def name(self):
         return self.get_computer_name()

     @name.setter
     def name(self, name):
         self.set_computer_name(name)

     def is_option_enabled(self, option):
         return True_or_False

Что мне еще нужноэти опции (и разделы тоже) связаны друг с другом с соответствующим переведенным именем и описанием (используя gettext).

Я знаю, что жесткий уровень представления кода в классах не очень хорошая идея ... Мне нужно что-то вроде шаблона проектирования, общегоидея / шаблон, как реализовать это, чтобы оно было качественным, простым в управлении и расширении.

Я собираюсь создать несколько внешних интерфейсов для этих классов (текст, графический интерфейс, веб), поэтому я не хочу, чтобы каждыйвремя повторить тот же код.

Я очень много думаю, но, к сожалению, у меня нет идеи, как это сделать, или у меня есть сомнения ...

Спасибо:)

Ответы [ 2 ]

1 голос
/ 25 января 2012

Я предполагаю, что ваши конфигурации строят дерево с узлами существ и разделами, являющимися опциями конфигурации.

Учитывая эту настройку, вы можете представить конфигурацию глубиной 2, например, сеть со следующими классами, используя декларативный API:

class InterfaceConfiguration(Configuration):
    mask = IPField()
    dns = IPField()
    IP = IPField()
    dhcp = BooleanField()
    driver = ChoiceField(choices=('madwifi', 'atheros', 'whatever'))

class NetworkConfiguration(Configuration):

   eth0 = InterfaceConfiguration(verbose_name='network interface eth0')
   eth1 = InterfaceConfiguration(verbose_name='network interface eth1')
   wlan0 = InterfaceConfiguration(verboxe_name='wireless network interface wlan0')
   hostname = StringField()
   domain = StringField()

Этот вид декларативного API достигается с помощью метаклассов , которые смотрят на dictshield и на many ORM и подробнее , которая реализует такую ​​функцию.

Учитывая этот набор классов, вы сможете управлять ими следующим образом:

>>> configuration = NetworkConfiguration('/path/to/config/file')
>>> configuration.eth0.verbose_name
'network interface eth0'
>>> configuration.eth0.mask.set('192.168.0.255')
True
>>> configuration.eth0.driver.choices
('madwifi', 'atheros', 'whatever')
>>> configuration.hostname.set('amokrane')
>>> configuration.domain.set('imazighen')
>>> configuration.wlan0.dhcp.get_value()
True

Этот вид API проще в реализации и не требует специальной конструкции Python (см. Ниже) и предоставляет возможность иметь другие методы, кроме get и set.

Если вам не нужны другие методы, кроме get / set, вы можете использовать дескрипторы python для реализации полей различного типа, я рекомендую вам прочитать статью Атрибуты и методы Python о предмете и иметь более глубокие знания. выглядит и приведенные выше ссылки на Python ORM, поскольку это используемый метод.

1 голос
/ 25 января 2012

Я бы сказал, что ваш проект выглядит довольно амбициозно.

И использование класса для каждого раздела не кажется мне хорошей идеей, поскольку в основном это означает, что добавление, удаление или изменение разделов потребуютизменения в коде, он не динамический и подразумевает выпуск новой версии, несовместимой с предыдущей.

Было бы лучше, если бы каждый раздел обрабатывался одинаково.

Для ядра, я думаю, вам понадобятся:

  1. Защищенный файл с объявлением допустимых разделов и опций
  2. A держатель конфигурации с доступом к такому файлу.
  3. A загрузчик для ваших файлов конфигурации:
    • Чтение / анализ ваших файлов конфигурации.
    • Сборка держателя конфигурации.
  4. Команды с доступом к вашему держателю конфигурации:
    • Абстракт BaseCommand, реализующий этот доступ,
    • Подклассыдля каждой фактической команды: Get, Add, Remove.

Тогда каждый интерфейс будет просто интерфейсом для этих команд.

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