基于类名在Python中动态调用函数

时间:2016-01-21 23:18:36

标签: python

我有一个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很新,不知道如何调用正确的类。

2 个答案:

答案 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()

说明:

  • 您需要知道哪些学校在哪个模块中。
  • 方法Get_Student_Details应该是静态的,因为没有使用对象信息(与Get_Students相同)
  • 较低的驼峰案例通常用于函数和变量名称

答案 1 :(得分:1)

我不确定我是否完全理解这个问题,但是有一个“学校”的映射表格可能会有所帮助 - > School_Object,而不是学校名称。

你在每个词典中的那种方式

{姓名:“John Smith”,学校:}

然后,您可以简单地遍历数组,访问与“School”键关联的值,然后在正确的类上调用get_student_details。