2016-08-30 3 views
0

Я пишу приложение Python, которое будет использовать файл конфигурации, поэтому я делегирую управление конфигурационным файлом в выделенный модуль configmanager и внутри него класс, ConfigManager.Python classes - запустить метод при вызове любого другого метода

Когда выполняется метод в пределах ConfigManager, который каким-то образом изменит мой конфигурационный файл, мне нужно будет получить последнюю версию файла с диска. Конечно, в духе DRY я должен делегировать открытие файла конфигурации своей собственной функции.

Тем не менее, я чувствую, что явным образом вызываю метод получения и возврата файла конфигурации в каждую редактируемую функцию, это не очень «чистое».

Есть ли рекомендуемый способ в Python для запуска метода и сделать значение доступным для других методов в классе, когда и до метод запускается в этом классе?

Другими словами:

  • Я создаю ConfigManager.edit_config().

  • Когда вызывается ConfigManager.edit_config(), выполняется другая функция ConfigManager.get_config_file().

  • ConfigManager.get_config_file() делает ценность доступной для метода ConfigManager.edit_config().

  • И ConfigManager.edit_config() теперь работает, имея доступ к значению, указанному ConfigManager.get_config_file().

Я ожидаю много версий edit_config() методов в ConfigManager, следовательно, желание DRY моего кода.

Есть ли рекомендуемый способ выполнения чего-то подобного? Или я должен просто создать функцию, чтобы получить конфигурацию в порядке, и вручную вызывать ее каждый раз?

+3

Uhm ... call 'self.get_config_file()' in 'edit_config()'? Явный лучше, чем неявный. В чем проблема этого явно? – deceze

+0

Как я уже сказал, мне кажется, что есть лучший способ, чем запустить функцию вручную каждый раз. Я думал, что у Python может быть специальный метод класса, например __init __(). Если нет, то я могу сделать это вручную, я просто хотел изучить другие возможности. – 99lives

+0

У вас есть много методов, которые нужно было бы назвать 'get_config_file'? Тогда я мог понять, что вы можете [DRY] (https://en.wikipedia.org/wiki/Don%27t_repeat_yourself) ваш код ... Но если этот метод нужно запускать всякий раз, когда вы вызываете 'edit_config', тогда он не делает разница, независимо от того, делает он это неявно или явно. – deceze

ответ

2

Естественный способ иметь:

ConfigManager.get_config_file() делает значение доступной для метода ConfigManager.edit_config().

должен иметь get_config_file()возвращение что значение.

Просто позвоните get_config_file() в пределах edit_config().

Если будут много версии edit_config(), то декоратор может быть путь:

def config_editor(func): 
    def wrapped(self, *args, **kwargs): 
     config_file = self.get_config_file() 
     func(self, config_file, *args, **kwargs) 
    return func 

class ConfigManager 
     . 
     . 
     . 
    @config_editor 
    def edit_config1(self, config_file, arg1): 
      ... 

    @config_editor 
    def edit_config2(self, config_file, arg1, arg2): 
      ... 

ConfigManager mgr 
mgr.edit_config1(arg1) 

Я на самом деле не так:

Во-первых, декларация edit_config1 принимает еще один аргумент, чем фактические потребности в использовании (поскольку декоратор предоставляет дополнительный аргумент).

Во-вторых, она не сохраняет все, что много котла планшет на:

def edit_config3(self, arg1): 
     config_file = self.get_config_file() 

В заключение, я не думаю, что декораторы сохранить достаточно повторения, чтобы быть стоит.

+0

Я знаю, что это возможно, я просто хочу посмотреть, есть ли другой способ сделать это; а не повторять одну и ту же функцию снова и снова в том, что, вероятно, станет очень большим количеством методов в ConfigManager. – 99lives

+0

Ах! Поэтому ваша проблема заключается в том, что есть * много * 'edit_config' функций. Вы должны изменить свой вопрос, чтобы уточнить это. –

0

Поскольку вы получаете что-то с диска, вы открываете файл. Таким образом, вы можете использовать класс с «функцией» python with.

Вы должны проверить менеджеров контекста. При этом вы сможете реализовать функциональные возможности, которые вы хотите каждый раз, когда кто-либо получает доступ к конфигурационному файлу с помощью метода __enter__ и (если необходимо) реализовать функциональность для остановки использования ресурса с помощью метода __exit__.

Смежные вопросы