在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)


即使我有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


因此,Field实例的creation_counter值每次将新字段添加到表单时都会增加。

然后,FormMeta类在字段上使用该值以正确的顺序对它们进行排序:

fields.sort(key=lambda x: (x[1].creation_counter, x[0]))

关于python - 类中属性的顺序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19912221/

10-11 19:01