类中的属性顺序

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个项目,名字将始终是第一个项目,最后一个名称是第二个名称?

Mar*_*ers 7

不,通常无法保证属性的顺序,因为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)