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

时间:2019-09-09 16:29:07

标签: python dynamic

假设我具有以下加载程序方法:

    #################################
    # 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 个答案:

答案 0 :(得分:1)

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

class MyClass:
    def __init__(self, param1, param2):
        # do stuff

args = MyClass.__init__.__code__.co_varnames
print(args)
> ('self', 'param1', 'param2')

从那里,您只能从参数列表中提取所需的参数。使用unpack运算符(*表示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)

答案 1 :(得分:0)

我认为这会起作用:

index.php

require __DIR__.'/../vendor/autoload.php';

$app = require_once __DIR__.'/../bootstrap/app.php';

然后我会这样称呼它:

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