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

    最近在做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中。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值