我有一个Python应用程序,我试图根据学校名称动态调用类中的函数。学校位于/ schools目录中的单独模块中:
def __init__(self):
self.Schools = []
self.Students = []
def Load_Selected_Schools(self):
files = glob.glob('schools/*.py')
for f in files:
self.Schools.append(self.Load_School(f))
def Load_School(self, path):
modname = os.path.splitext(os.path.basename(path))[0]
mod = imp.load_source(modname, path)
return mod
每个单独的学校模块都是这样的:
class xyz(object):
def Get_School_Name(self):
return "xyz"
def Get_Students(self):
Students = []
#code removed for clarity
#But basically I create a bunch of Student objects
Student = {}
Student['Name'] = "John Smith"
Student['School'] = "xyz"]
return Students
def Get_Student_Details(self):
# This will return student details
此时我最终得到一个包含如下项目的数组:
{ Name: "John Smith", School: "xyz" }
{ Name: "Bob Jane", School: "abc" }
{ Name: "Jane Davis", School: "xyz" }
... etc
我想要做的是遍历此数组,然后为正确的学校调用Get_Student_Details函数。所以数组中的第一个条目应该调用xyz类中的Get_Student_Details函数,abc类中的第二个函数,xyz类中的第三个函数,每次传入Name参数。
我对Python很新,不知道如何调用正确的类。
答案 0 :(得分:1)
您可以使用getattr:
动态调用模块中的类class_ = getattr(module, 'xyz')
class_().Get_School_Name()
我会将学校存放在字典而不是列表中,其中键表示学校名称(假设每个学校只有一个模块)。然后你可以做这样的事情。
for student in student_list:
class_ = getattr(self.Schools[student["School"]], student["School"])
class_().Get_Student_Details()
说明:
答案 1 :(得分:1)
我不确定我是否完全理解这个问题,但是有一个“学校”的映射表格可能会有所帮助 - > School_Object,而不是学校名称。
你在每个词典中的那种方式
{姓名:“John Smith”,学校:}
然后,您可以简单地遍历数组,访问与“School”键关联的值,然后在正确的类上调用get_student_details。