我有一个类,需要通过配置文件来创建对象,测试类如下:
那么全路径就是:
lib.utils.test.Test
代码如下:
class Test(object):
def __init__(self, name=1, age=1, **kwargs):
self.name = name
self.age = age
def get_name(self):
return self.name
def get_age(self):
return self.age
对于java程序源来说,首先想到的就是class.forName方法,那么python有没有对应的方法呢?
可惜的是没有现成的,不过可以基于python已有的API写一个,例子如下:
import importlib
def for_name(name):
"""
reflect class base on the passed class name
param: name, the full class path contains class name
type: str
"""
# class_name = Test
class_name = name.split('.')[-1]
# import_module("lib.utils.test")
file = importlib.import_module(name[:name.index("." + class_name)])
clazz = getattr(file, class_name)
return clazz
Test = for_name("lib.utils.test.Test")
print(Test)
tt = Test(**{"name": "darren", "age": 18})
print(tt.get_name())
print(tt.get_age())
这里利用到了importlib包来实现的,可以参考for_name方法
执行结果如下:
<class 'lib.utils.test.Test'>
darren
18
实现了设想的功能。
今天看了一篇文章,有另一个方法也可以实现,如下:
def for_name(name):
"""
reflect class base on the passed class name
param: name, the full class path contains class name
type: str
"""
# class_name = Test
class_name = name.split('.')[-1]
# import_module("lib.utils.test")
file = __import__(name[:name.index("." + class_name)], fromlist=True)
clazz = getattr(file, class_name)
return clazz
# 注意,只是把importlib.import_module 换成了__import__ 加了fromlist参数
抽时间再研究研究别的方法