Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中通过字符串获取实例的属性?_Python - Fatal编程技术网

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

在python中通过字符串获取实例的属性?,python,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 settin

我有一个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
这可能吗?

您可以使用
setattr(对象、属性、值)

这将在给定的
对象上将
属性设置为

您可以使用
setattr(对象、名称、值)


是一个内置函数。

对象可以被认为是精力充沛的字典。事实上,他们有一个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
你会得到你想要的。但这有点老土

函数setattr(,)也做同样的事情,它只是一种明确的(非黑客的)方法,将来无论发生在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(),并且使用了一个内部循环,该循环在包含(,)的元组上运行。这是一种不同的方式,可能更具可读性,也可能不更具可读性,这取决于您试图解决的问题以及您习惯于阅读的代码类型。

这也适用于较长的变量?像
setattr(g.currentschool.school\u hours,day+'\u end',end\u value)
是的,您也可以使用变量来指定对象。那么这是否有效<代码>getattr(表单,日期+“_start”)。选项
。根据字符串获取的动态变量设置一个变量。@Johnston
g.currentschool.school\u hours
被计算为普通,并生成一个对象(
setattr
和friends不是特殊的,只是普通函数)。因此,如果要在该计算结果所针对的对象上设置属性,则选择“是”即可。类似地,第二条注释中的
getattr
调用的计算结果与其他所有函数调用一样,都是一个对象,如果您想读取它产生的对象的
choices
属性,那么“是”就行了。这些函数并不神奇。使用
getattr
/
setattr
与直接访问对象的
\uuuuuu dict\uuuu
不是一回事。在第一种情况下,您将触发属性查找机制,该机制将适当处理计算属性、继承性、动态属性解析等。在第二种情况下,您将完全绕过它,这可能会产生非常意外的结果。此外,并非所有类型都有
\uuuuu dict\uuuuu
(阅读关于插槽的更多信息)。事实上,这是正确的。也许我的答案过于粉饰(而通常我的答案过于深入)。如果OP好奇的话,故事会变得有趣得多。这篇CafePy文章很好地解释了Python中对象的内部工作原理/原因(虽然很老,但很好,仍然普遍适用于Python3):
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
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]())