python创建类的实例方法-Python中动态创建类实例的方法
簡介
在Java中我們可以通過反射來根據類名創建類實例,那么在Python我們怎么實現類似功能呢?
其實在Python有一個builtin函數import,我們可以使用這個函數來在運行時動態加載一些模塊。如下:
1
2
3
4
5
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
例子
首先我們建一個目錄 my_modules,其中包括三個文件
* init.py: 模塊文件
* my_module.py: 測試用的模塊
* my_another_module: 另一個測試用的模塊
my_module.py
1
2
3
4
5
6
7
8
9
10
11
12
13
from my_modules.my_another_moduleimport *
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
1
2
3
class MyAnotherObject(object):
def test(self):
print "MyAnotherObject.test"
test.py
1
2
3
4
5
6
7
8
9
10
11
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集成
對于使用pyinstaller打包的應用程序,如果使用上面的代碼,運行打包后的程序會出現下面的錯誤
1
2
3
4
5
6
7
Traceback (most recent call last):
File "test.py", line12,in
obj= createInstance("my_modules.my_module","MyObject")
File "test.py", line7,in createInstance
module_meta= __import__(module_name,globals(),locals(), [class_name])
ImportError: No module named my_modules.my_module
Failed to execute script test
這里錯誤的原因是 pyinstaller 在打包分析類的時候沒有分析到 my_modules 下面的模塊,所以運行報錯。
解決辦法一:
在 test.py 中把 my_modules 下的模塊手動 import,見下面代碼中的第一行。這種方法最簡單,但是顯然不太好。
1
2
3
4
5
6
7
8
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 打包的時候,指定 “–hidden-import”,如下
1
pyinstaller-D--hidden-import my_modules.my_module test.py
解決辦法三:
動態修改 python 運行時path,見下面代碼中的前兩行,其中path我們可以通過環境變量或者參數傳遞進來。顯然這種方法要比前兩種方法靈活的多。
1
2
3
4
5
6
7
8
9
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()
以上所述是小編給大家介紹的Python中動態創建類實例的方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!
總結
以上是生活随笔為你收集整理的python创建类的实例方法-Python中动态创建类实例的方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 求轮开头的成语接龙!
- 下一篇: 用什么擦地最干净脑筋急转弯_22个数学脑