setattr
允许您在Python类中动态命名属性。我正在尝试使用App Engine模型做类似的事情:
class MyModel(db.Model):
def __init__(self, *args, **kwargs):
super(MyModel, self).__init__(*args, **kwargs)
# Doesn't fully work
setatr(self, 'prop1', db.ListProperty(db.Key))
setatr(self, 'prop2', db.StringListProperty())
# Works fully
# prop1 = db.ListProperty(db.Key))
# prop2 = db.StringListProperty())
此代码编译,但是当我稍后调用model.prop1.append(key)
时,我收到此错误:
AttributeError: 'ListProperty' object has no attribute 'append'
我怀疑这是因为prop1
是在模型而不是self.prop1
中声明的,但我并不完全理解语法的重要性。
有没有人完成这项工作,或者有没有人对语法差异有任何见解?
答案 0 :(得分:5)
我认为您正在寻找db.Expando
课程(而不是db.Model
)。
答案 1 :(得分:1)
这个问题:
举例说明你想做什么。
答案 2 :(得分:1)
不确定但是这可行:
class MyModel(db.Model):
@classmethod
def new(cls, *args, **kwargs):
setattr(cls, 'props1', db.ListProperty(db.Key))
setattr(cls, 'props2', db.StringListProperty())
mymodel = cls(*args, **kwargs)
delattr(cls, 'props1')
delattr(cls, 'props2')
return mymodel