根据输入数据创建不同名称对象

    最近在做Python的项目,遇到一个需求,根据文件夹下的文件名创建不同名称的对象,同时根据输入数据,让不同的对象进行执行。最后解决的时候,发现了两种方法,分别是基于Python的dict和exec()函数的,这里先讲基于字典的方法,相比两个方法,基于字典的方法我觉得是更优雅的。

    直接放上代码,最上面的for循环,就是根据输入数据创建不同的对象,最上面首先要声明一个字典,之后通过format,根据输入名称进行对象创建对象。一般对于字典,最主要的用途是哈希表,存放数值啊、字符串啊什么的,这里的话,就相当于是将字符串作为key,将对象作为value,也就是用于存储对象的。后面的回调函数里面,根据输入数据执行不同对象的方法。

camera_dict = {}
for camera_name_index in camera_names:
    camera_dict["camera_{}".format(camera_name_index)] = interface.tool()

def callback():
    # 以下是回调函数里的内容
    camera_dict["camera_{}".format(camera_name)].analyse(image_name_list, camera_matrix)
    traceclassID = camera_dict["camera_{}".format(camera_name)].classID
    new_point_value = camera_dict["camera_{}".format(camera_name)].new_point
    print(traceclassID, new_point_value)

    然后介绍基于exec()的,exec()这个函数挺难用的,最大的问题在于作用域,一开始没整明白。首先还是放代码。

for camera_name_index in camera_names:
    exec('camera_{} = interface.tool()'.format(camera_name_index))

def callback():
    # 以下是回调函数里的内容
    glo = globals()
    exec('camera_{}.analyse(image_name_list, camera_matrix'.format(cameraID))
    # 以下两句执行之后,并不会进行赋值
    # exec('traceclassID = camera_{}.classID'.format(cameraID))
    # exec('new_point_value = camera_{}.new_point'.format(cameraID))
    camera_name = 'camera_' + str(cameraID)
    traceclassID = glo[camera_name].classID
    new_point_value = glo[camera_name].new_point
    print(traceclassID, new_point_value)

这里有一个注释:以下两句执行之后,并不会进行赋值,之前我是这么写的,以为这样就可以将数值幅值过去,后面发现不对,得不到结果。然后去查阅了一下相关资料,了解了一下作用域这个概念,作用域的话,分为globals()和locals()两个,这里用的是globals(),因为我的对象是在回调函数之外定义的,所有的相关信息均会保存在glo中,我通过glo[camera_name]就能读到这个对象的信息,然后得到这个对象的某些属性。如果是在exec()里面执行赋值语句,其实是没办法读到相关数据的,因为相关数据均保存在glo中。

原创文章 26 获赞 35 访问量 6万+

猜你喜欢

转载自blog.csdn.net/love_ljq/article/details/105126178
今日推荐