Python类 - 在调用任何其他方法时运行方法

时间:2016-08-30 07:58:50

标签: python

我正在编写一个将使用配置文件的Python应用程序,因此我将配置文件的控制权委托给专用模块configmanager,并在其中委托一个类ConfigManager。< / p>

每当运行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方法,因此希望干掉我的代码。

是否有推荐的方式来完成这样的事情?或者我应该创建一个函数来使配置正常,并且每次都手动调用它?

2 个答案:

答案 0 :(得分:2)

自然的方式:

  

ConfigManager.get_config_file()为该方法提供值   ConfigManager.edit_config()

要让get_config_file() 返回该值。

只需在get_config_file()内拨打edit_config()

如果有{em>许多版本的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()

总之,我认为装饰者没有足够的重复来值得。

答案 1 :(得分:0)

由于您从磁盘获取内容,因此您可以打开文件。因此,您可以使用具有python的with“函数”的类。

您应该检查上下文管理器。有了这个,您将能够在每次有人通过__enter__方法访问配置文件时实现您想要的功能,并且(如果需要)实现停止使用{{1的资源'的功能}} 方法。