有没有在线的人阿,请教关于动态调用类和类下面函数的问题。因为我这里有很多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代码,因此在生产环境中使用时需要慎重