99热99这里只有精品6国产,亚洲中文字幕在线天天更新,在线观看亚洲精品国产福利片 ,久久久久综合网

歡迎加入QQ討論群258996829
麥子學(xué)院 頭像
蘋果6袋
6
麥子學(xué)院

Python中如何實(shí)現(xiàn)動(dòng)態(tài)創(chuàng)建類?

發(fā)布時(shí)間:2017-03-25 15:02  回復(fù):0  查看:2006   最后回復(fù):2017-03-25 15:02  
Java 中我們可以通過反射來根據(jù)類名創(chuàng)建類實(shí)例 , 那么在 Python開發(fā)我們?cè)趺磳?shí)現(xiàn)類似功能呢?
  其實(shí)在Python 有一個(gè) builtin 函數(shù)  import  ,我們可以使用這個(gè)函數(shù)來在運(yùn)行時(shí)動(dòng)態(tài)加載一些模塊。如下:
   def  createInstance(module_name, class_name, *args, **kwargs):
  module_meta = __import__(module_name, globals(), locals(), [class_name])
  class_meta = getattr(module_meta, class_name)
  obj = class_meta(*args, **kwargs)
   return obj
   例子
  首先我們建一個(gè)目錄 my_modules, 其中包括三個(gè)文件
  init .py:  模塊文件
  * my_module.py:  測(cè)試用的模塊
  * my_another_module:  另一個(gè)測(cè)試用的模塊
   my_module.py
   from my_modules.my_another_module  import *
   class  MyObject(object):
   def  test(self):
   print 'MyObject.test'
  MyObject1().test()
  MyObject2().test()
  MyAnotherObject().test()
   class  MyObject1(object):
   def  test(self):
   print 'MyObject1.test'
   class  MyObject2(object):
   def  test(self):
   print 'MyObject2.test'
   my_another_module.py
   class  MyAnotherObject(object):
   def  test(self):
   print 'MyAnotherObject.test'
   test.py
   def  createInstance(module_name, class_name, *args, **kwargs):
  module_meta = __import__(module_name, globals(), locals(), [class_name])
  class_meta = getattr(module_meta, class_name)
  obj = class_meta(*args, **kwargs)
   return obj
  obj = createInstance("my_modules.my_module", "MyObject")
  obj.test()
   MyObject.test MyObject1.test MyObject2.test MyAnotherObject.test
   pyinstaller集成
  對(duì)于使用pyinstaller 打包的應(yīng)用程序,如果使用上面的代碼,運(yùn)行打包后的程序會(huì)出現(xiàn)下面的錯(cuò)誤
  Traceback (most recent  call  last):
   File "test.py", line 12,  in < module>
  obj = createInstance("my_modules.my_module", "MyObject")
   File "test.py", line 7,  in createInstance
  module_meta = __import__(module_name, globals(), locals(), [class_name])
  ImportError:  No  module named my_modules.my_module Failed  to  execute script  test
  這里錯(cuò)誤的原因是 pyinstaller  在打包分析類的時(shí)候沒有分析到  my_modules  下面的模塊,所以運(yùn)行報(bào)錯(cuò)。
   解決辦法一:
  在 test.py  中把  my_modules  下的模塊手動(dòng)  import ,見下面代碼中的第一行。這種方法最簡(jiǎn)單,但是顯然不太好。
   import my_modules.my_module
   def  createInstance(module_name, class_name, *args, **kwargs):
  module_meta = __import__(module_name, globals(), locals(), [class_name])
  class_meta = getattr(module_meta, class_name)
  obj = class_meta(*args, **kwargs)
   return obj
  obj = createInstance("my_modules.my_module", "MyObject")
  obj.test()
   解決辦法二:
  在使用 pyinstaller  打包的時(shí)候,指定  “–hidden-import” ,如下
   pyinstaller  -D  --hidden-import  my_modules.my_module  test.py
   解決辦法三:
  動(dòng)態(tài)修改 python  運(yùn)行時(shí) path ,見下面代碼中的前兩行,其中 path 我們可以通過環(huán)境變量或者參數(shù)傳遞進(jìn)來。顯然這種方法要比前兩種方法靈活的多。
   import sys
  sys.path.append(...)
   def  createInstance(module_name, class_name, *args, **kwargs):
  module_meta = __import__(module_name, globals(), locals(), [class_name])
  class_meta = getattr(module_meta, class_name)
  obj = class_meta(*args, **kwargs)
   return obj
  obj = createInstance("my_modules.my_module", "MyObject")
  obj.test()
來源: kongxx 的專欄
您還未登錄,請(qǐng)先登錄

熱門帖子

最新帖子

?