Python 如何动态实例化一个构造函数采用多个参数的类?
假设我有以下加载程序方法:Python 如何动态实例化一个构造函数采用多个参数的类?,python,dynamic,Python,Dynamic,假设我有以下加载程序方法: ################################# # Load a class ################################# def __load_class(self, module_name, class_name, params): try: loaded_class = getattr(importlib.import_module(module_n
#################################
# Load a class
#################################
def __load_class(self, module_name, class_name, params):
try:
loaded_class = getattr(importlib.import_module(module_name), class_name)
obj = loaded_class(params)
return obj
except Exception as ex:
self.logger.error("FAILED to load class: {0}.{1}\n{2}".format(module_name, class_name, traceback.format_exc()))
如何将实例化类所需的params
传递到此方法?我有一些类采用1个参数,其他类采用2个参数
注意:我无法控制要实例化的类。我 不能改变他们的论点
您可以动态确定所需的参数,如下所示:
class MyClass:
def __init__(self, param1, param2):
# do stuff
args = MyClass.__init__.__code__.co_varnames
print(args)
> ('self', 'param1', 'param2')
从那里,您只能从参数列表中提取所需的参数。使用解包运算符(*用于args,**用于kwargs)
我认为这会奏效:
#################################
# Load a class
#################################
def __load_class(self, module_name, class_name, params):
try:
loaded_class = getattr(importlib.import_module(module_name), class_name)
obj = loaded_class(*params)
return obj
except Exception as ex:
self.logger.error("FAILED to load class: {0}.{1}\n{2}".format(module_name, class_name, traceback.format_exc()))
然后我会这样称呼它:
self.__load_class(module_name, class_name, [arg1])
或
如果您将类构造函数设置为接受命名参数,则可以将参数更改为
**kwargs
,然后执行加载的_class(**kwargs)
。根据客户端代码,您可以使用*args和/或**kwargs。我无法控制要实例化的类。我不能改变他们的论点。我认为任何指向副本的链接都没有帮助。他们说我不能改变我的类的参数。假设我不能控制我试图实例化的类。我不能改变它们。我只是在写一个动态的实例,它不如@C_Z____________________________________!
self.__load_class(module_name, class_name, [arg1])
self.__load_class(module_name, class_name, [arg1, arg2])