1

setattr позволяет динамически определять атрибуты в классах Python. Я пытаюсь сделать что-то подобное с Engine Model App:Можно ли динамически назвать атрибуты в модели 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

вам действительно нужен динамически добавляемый класс собственности, или являются Expando с SetAttr, что вы ищете ли? – 2010-11-24 04:07:17

ответ

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