为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

四季花海 2022-05-24 16:36:33
假设我有以下加载器方法:    #################################    # 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 个参数的类。注意:我无法控制要实例化的类。我无法改变他们的论点。
查看完整描述

2 回答

?
茅侃侃

TA贡献1842条经验 获得超21个赞

您可以像这样动态确定所需的参数:


class MyClass:

    def __init__(self, param1, param2):

        # do stuff


args = MyClass.__init__.__code__.co_varnames

print(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)


查看完整回答
反对 回复 2022-05-24
?
互换的青春

TA贡献1797条经验 获得超6个赞

我认为这会起作用:


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

    # 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])


查看完整回答
反对 回复 2022-05-24
  • 2 回答
  • 0 关注
  • 108 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信