1

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,但我并不完全理解语法的意义。

有没有人做到这一点,或者有没有人对句法差异有任何见解?

4

3 回答 3

5

我认为您正在寻找db.Expando课程(而不是db.Model)。

于 2010-11-23T04:00:20.537 回答
1

这个问题:

举例说明您想要做什么。

于 2010-11-23T04:07:58.007 回答
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
于 2011-01-31T01:40:23.140 回答