如何动态实例化其构造函数采用多个参数的类?

假设我有以下加载器方法:


    #################################

    # 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 个参数的类。


注意:我无法控制要实例化的类。我无法改变他们的论点。


四季花海
浏览 109回答 2
2回答

茅侃侃

您可以像这样动态确定所需的参数:class MyClass:    def __init__(self, param1, param2):        # do stuffargs = MyClass.__init__.__code__.co_varnamesprint(args)> ('self', 'param1', 'param2')从那里您可以仅从参数列表中提取所需的参数。使用解包操作符(* 表示 args,** 表示 kwargs)params = {'param1': 'foo', 'param2': 'bar', 'param3': 'baz'}params_to_pass = {argname:params[argname] for argname in args[1:]} # ignore 'self'obj = MyClass(**params_to_pass)

互换的青春

我认为这会起作用:    #################################    # 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])或者self.__load_class(module_name, class_name, [arg1, arg2])
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python