关于动态调用类和类函数的问题,如何解决?

有没有在线的人阿,请教关于动态调用类和类下面函数的问题。因为我这里有很多class需要动态调用。

也许我的设计结构也有问题,只是想表达一个意思,请指导。


class Class_1(object):
    def __init__(self, order=None):
        self.order = order
    def do_foo(self):
        print(self.order)
    def do_bar(self):
        print(123)


class Class_2(object):
    def __init__(self, order=None):
        self.order = order
    def do_foo(self):
        print(self.order)
    def do_bar(self):
        print(11)

class main(object):
    def __init__(self, classId, defId):
        self.classId = classId
        self.defId = defId
        self.class_dict = {
            1: 'Class_' + self.classId,
            2: 'Class_' + self.classId,
        }
        self.def_dict = {
            1: 'do_foo',
            2: 'do_bar'
        }
    def run(self):
        #   如何动态调用 类 和 类下面的函数


if __name__ == '__main__':
    order = 'OrderNo123'
    classId = 1
    defId = 2
    main(classId, defId).run()

如果想要动态调用类和类函数,可以使用eval()函数。eval()函数可以将字符串当做代码来执行,因此可以将类名和函数名存储在字符串中并使用eval()来调用。

例如,在main类中的run()函数中,可以这样调用类和类函数:

class_name = self.class_dict[self.classId]
def_name = self.def_dict[self.defId]
eval(class_name + '().' + def_name + '()')

这样,程序会根据classId和defId来动态调用对应的类和类函数。

另外,使用eval()函数可能会存在安全风险,因此在生产环境中一般不推荐使用。可以使用其他方式来实现类和函数的动态调用。还有一种方式可以使用python的反射来实现类和类函数的动态调用。

使用 getattr() 函数可以获取对象的属性或方法,并且可以指定属性或方法名称为变量。

例如:

class Class_1(object):
    def __init__(self, order=None):
        self.order = order
    def do_foo(self):
        print(self.order)
    def do_bar(self):
        print(123)
class Class_2(object):
    def __init__(self, order=None):
        self.order = order
    def do_foo(self):
        print(self.order)
    def do_bar(self):
        print(11)
class main(object):
    def __init__(self, classId, defId):
        self.classId = classId
        self.defId = defId
        self.class_dict = {
            1: Class_1,
            2: Class_2,
        }
        self.def_dict = {
            1: 'do_foo',
            2: 'do_bar'
        }
    def run(self):
        # 通过反射获取类和类函数
        cls = self.class_dict[self.classId](order='OrderNo123')
        func = getattr(cls, self.def_dict[self.defId])
        func()
if __name__ == '__main__':
    classId = 1
    defId = 2
    main(classId, defId).run()

这样就可以实现类和类函数的动态调用了。

在这个代码里,传入的classId和defId用来指定要调用的类和函数,然后通过getattr函数来动态调用类和类函数.

在python中,可以使用 "eval" 和 "getattr" 函数来实现类和类函数的动态调用。

1.使用 "eval" 函数:
eval(self.class_dict[self.classId] + '().' + self.def_dict[self.defId] + '()')

2.使用 "getattr" 函数:
class_obj = eval(self.class_dict[self.classId] + '()')
class_func = getattr(class_obj, self.def_dict[self.defId])
class_func()

3.使用 exec()

exec(f'{self.class_dict[self.classId]}().{self.def_dict[self.defId]}()')

不过由于eval() 和 exec() 都是非常危险的,因为它们可以在你的程序中执行任何的Python代码,因此在生产环境中使用时需要慎重