Skip to main content
 首页 » 编程设计

python之类中属性的顺序

2025年05月04日13lautakyan007

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