在python中基于ini配置实例化类

在python中基于ini配置实例化类,python,python-3.x,python-2.7,Python,Python 3.x,Python 2.7,在python中有一种情况,我需要加载一个模块并根据INI配置中提供的值实例化一个类 [providers] provider=bsnl ; provider may be bsnl/airtel/vodafone/etc.. 在我的类中,我读取这个值,在类方法中,我必须加载bsnl_provider.py并实例化BSNLClass。如果提供程序更改为airtel,那么我必须加载airtel\u provider.py并实例化AIRTElClass 如何加载相关模块并实例化相关类?如果我理解

在python中有一种情况,我需要加载一个模块并根据INI配置中提供的值实例化一个类

[providers]
provider=bsnl  ; provider may be bsnl/airtel/vodafone/etc..
在我的类中,我读取这个值,在类方法中,我必须加载bsnl_provider.py并实例化BSNLClass。如果提供程序更改为airtel,那么我必须加载airtel\u provider.py并实例化AIRTElClass


如何加载相关模块并实例化相关类?

如果我理解清楚,您希望从ini文件中获取未来类的名称

  import ConfigParser

  config = ConfigParser.ConfigParser()
  config.read('providers.ini')

  try:
      provider_name = config.get("providers", "provider")
  except ConfigParser.NoOptionError:
      print("Unable to find provider")
      raise
之后,您可以动态创建类(无任何超类):

或与:

provider_class = type(provider_name.upper(), (MySuperClass,), {}) 

也许您应该通过在某处公开映射
{'airtel':AIRTElClass,}
来简化问题?但目前还不清楚你到底在解决问题的哪一部分,或者你在解决问题上付出了什么努力;例如,如果您想按名称加载模块,请参见,例如,如果我在一个类级别i中添加了这样的映射,如果出现任何新的提供程序,则必须再次更改映射,我如何避免这种情况?您可以使用一些超类/元类/装饰器来注册类,但这也是一个你应该作为一个独立问题来研究的主题。你能详细阐述一下吗,这样我就可以对它进行研究了?这取决于你选择哪种方法,这就是为什么我建议你做这项工作。例如,有关超类选项,请参见。如果您对某个实现有特定的问题,那么您可以稍后再问,但这一问题目前太广泛了。我可以阅读ini文件,我不想在后面定义模块和类名。
provider_class = type(provider_name.upper(), (MySuperClass,), {})