python利用字典保存配置实现动态调用模块类方法
  admin 发表于 2016-01-16 11:39  分类:技术资料  1,169 次阅读  0条评论

有这么一种需求——配置文件中某个字段值是类名,根据这些类名生成对应的对象

例如

[{"platform":"tzmb"},

{"platform":"tgb"},

{"platform":"sinaweibo"}]

根据上面配置文件分别生成类 tzmb、tgb、sinaweibo的对象。


最笨的办法自然是读取platform之后,根据值进行if、else,不同的值生成不同的对象。

但是利用python的getattr可以不用这么复杂就能满足要求,下面的代码提供了一个能够满足这种需求的很好的示例!转自http://blog.csdn.net/5iasp/article/details/23253293

#coding=UTF-8

class TestClass:

   def sub(self,a,b):

       return a-b

   def add(self,a,b):

       return a+b

   def chen(self,a,b):

       return a*b

class TestClassA:

   def sub(self,a,b):

       return a-b

   def add(self,a,b):

       return a+b

   def chen(self,a,b):

       return a*b

   

class TestClassB:

   def sub(self,a,b):

       return a-b

   def add(self,a,b):

       return a+b

   def chen(self,a,b):

       return a*b

       

       

sys_config={}

sys_config["01"]=['mytest','TestClassA','add']

sys_config["02"]=['mytest','TestClassA','sub']

sys_config["03"]=['mytest','TestClassA','chen']

sys_config["04"]=['mytest','TestClassB','add']

sys_config["05"]=['mytest','TestClassB','sub']

sys_config["06"]=['mytest','TestClassB','chen']

def main():

   class_name = "TestClass" #类名

   module_name = "mytest"   #模块名

   method = "chen"          #方法名

   module = __import__(module_name) # import module

   print "#module:",module

   c = getattr(module,class_name)  

   print "#c:",c

   obj = c() # new class

   print "#obj:",obj

   print(obj)

   obj.chen(2,3)

   mtd = getattr(obj,method)

   print "#mtd:",mtd

   print mtd(2,3) # call def

   

   mtd_add = getattr(obj,"add")

   t=mtd_add(1,2)

   print "#t:",t

   mtd_sub = getattr(obj,"sub")

   print mtd_sub(2,1)

   

   

   ywdm='02'

   

   my_module_name=sys_config[ywdm][0]

   my_class_name=sys_config[ywdm][1]

   my_method_name=sys_config[ywdm][2]

   

   my_module = __import__(my_module_name)

   my_class = getattr(my_module,my_class_name)

   my_obj = my_class()

   my_method = getattr(my_obj,my_method_name)

   

   print my_method(5,2)

   

 

if __name__ == '__main__':

  main()

本文固定链接: http://www.youduoshao.com/2016-01-16/201601162518.html

填写您的称呼和邮箱即可发布评论

快捷键:Ctrl+Enter