use*_*318 1 python oop wtforms
在python中保证保持类中属性的顺序吗?这是如何保证的?在手册中指定的位置?
这将声明性地将字段定义为类属性:
class MyForm(Form):
first_name = TextField(u'First Name', validators=[validators.required()])
last_name = TextField(u'Last Name', validators=[validators.optional()])
...
def get(self):
form = MyForm(self.request.arguments)
form=form
self.render('forms.html', form=form)
Run Code Online (Sandbox Code Playgroud)
即使我有n个项目,名字将始终是第一个项目,最后一个名称是第二个名称?
不,通常无法保证属性的顺序,因为Python将属性存储在字典中.
相反,wtforms使用特殊技巧来检测字段定义的顺序,这可以解决这个问题.每次创建Field对象时,计数器都会递增,并为字段实例分配唯一编号.这使得对象可以订购:
class UnboundField(object):
_formfield = True
creation_counter = 0
def __init__(self, field_class, *args, **kwargs):
UnboundField.creation_counter += 1
# [...]
self.creation_counter = UnboundField.creation_counter
Run Code Online (Sandbox Code Playgroud)
因此,每次将新字段添加到表单时,Field实例creation_counter都会增加一个值.
本FormMeta类然后使用该上的字段值,以正确的顺序排序他们:
fields.sort(key=lambda x: (x[1].creation_counter, x[0]))
Run Code Online (Sandbox Code Playgroud)