我想动态设置属性,这样Python:无法动态地将属性设置为FlaskForm?
form = ModelForm(request.form)
文件FlaskForm form.py
class ModelForm(FlaskForm):
def __init__(self, postData):
super(ModelForm, self).__init__()
for p in postData:
setattr(ModelForm, p, StringField(p, validators=[InputRequired()]))
但它仅适用于运行,第一次运行的第二次合作,这不工作。
我真的不明白python构造函数是如何工作的。 由于这post,它说,由于
class A is not fully initialized when you do your setattr(A, p, v) there.
但在其他语言中,对象已经被构造完成之后创建的,它已经满级的变量,属性在构造函数中声明?
例如,它的工作原理可以打印a.key。那么烧瓶构造函数和这个有什么不同呢?
class A(object):
def __init__(self):
self.a = 'i am a accessor'
setattr(self, 'key', 'value')
a = A()
print a.a
print a.key
我用关于构造函数的例子更新了这个问题,以澄清那里的区别。由于“我不知道Python的内部工作原理”,因此Python中的构造函数无法正常工作,或者Flask表单对库执行了一些操作以防止完成对象初始化。 Ofcouse,我们可以用'setattr'后面的很多方法来解决,但它并不能帮助我理解Flask或Python构造函数的情况。 – TomSawyer
如果你尝试在'setattr之后放置'super().__ init__',会发生什么? '?但是为什么你甚至想在'__init__'中使用'setattr'?您正在尝试构建一个在构造过程中更改其蓝图的对象。我甚至不知道这是否应该起作用。 – Feodoran
在setattr之后放置'super()'不起作用,它会给出错误'TypeError:'NoneType'对象不可迭代。在__init__里面的Setattr是很好的做法,可以在每种语言中工作,它有助于避免写更多的行来声明表单对象,我只需要:'form = MyForm(attrs)' – TomSawyer