在python中通过字符串获取实例的属性?

时间:2013-12-30 12:19:58

标签: python

我有一个wtform,其中包含天数和开始和结束时间列表:

form.mon_start
form.mon_end
form.tues_start
form.tues_end
...

我必须经常设置这些,我想循环一个列表并将它们设置在一个循环中。类似的东西:

days = ['mon','tues','weds','thurs','fri','sat','sun']
for day in days:
    form.[day + '_start'] = #some datetime setting
    form.[day + '_end'] = #some datetime setting

这可能吗?

3 个答案:

答案 0 :(得分:2)

您可以使用setattr(object, attribute, value)

days = ['mon','tues','weds','thurs','fri','sat','sun']
for day in days:
    setattr(form, day + '_start', start_value)
    setattr(form, day + '_end', end_value)

这会将给定attribute的{​​{1}}设置为value

答案 1 :(得分:0)

您可以使用setattr(object, name, value)

setattr(form, day+'_start', value)

setattr是内置函数。

答案 2 :(得分:0)

可以将对象视为词典。事实上,他们有一个 dict 。所以试试这个:

days = ['mon','tues','weds','thurs','fri','sat','sun']
for day in days:
    form.__dict__[day + '_start'] = #some datetime setting
    form.__dict__[day + '_end'] = #some datetime setting

你会得到你想要的东西。但它有点hackish。

函数setattr(,)做同样的事情,它只是一种明确的(非hackish)这样做的方式,并且无论在 dict

days = ['mon','tues','weds','thurs','fri','sat','sun']
for day in days:
    for mark in [('start', gen_start_func), ('end', gen_end_func)]:
        setattr(form, '_'.join([day, mark[0]]), mark[1]())

所以在最后一个版本中我们使用的是setattr(),我们正在使用一个内部循环,它在包含(,)的元组上运行。它是一种不同的做事方式,可能会或可能不会更具可读性,这取决于您尝试解决的问题以及您习惯阅读的代码类型。