2013-01-15 46 views
2

我想在持續的appengine模型中引用不同的類。像:如何在Python中有效保存引用的類類型? (appengine)

class Animal(): 
    def eat(self, food): 
    return food - 1 

class Cat(Animal): 
    def eat(self, food): 
    return food - 2 

class Dog(Animal): 
    def eat(self, food): 
    return food - 3 

class Person(db.Model): 
    name = db.StringProperty() 
    pet = Animal() 

我希望能夠到任何一個貓()或狗()實例分配作爲寵物,保存並可以重新加載一個Person對象,在其引用的原始類型的動物。寵物對象的持久性並不重要,我只想用類的方法定義不同的行爲集。我該怎麼做呢?

謝謝!

+0

'動物'子類'db.Model'還是像你放在這裏一樣嗎?如果'Animal'是一個模型類,那麼你可以在'Person'中使用'ReferenceProperty'來'Animal'。 – RocketDonkey

+0

不,這就是爲什麼我說動物類和它的孩子不是持久的。我想動物類是一個db.Model或db.PolyModel不會解決問題沒有任何持久變量。 – greg

回答

1

查看PolyModel類。

+0

根據我的理解,PolyModel將返回您在**查詢**本身中定義的類的類型。 Animal.all()將返回Dog和Cat記錄的公共變量(我沒有),但方法將是Animal()。我希望能夠通過永久性Person對象訪問Dog和Cat特定的方法。 – greg

0

我能拿出自己的最好的是一個getter方法(假設上述動物,貓,狗類):

class Person(db.Model): 
    name = StringProperty() 
    pet = StringProperty(choices=('cat','dog')) 

    def get_pet(self): 
    dict = { 'cat': Cat, 'dog': Dog } 
    return dict[self.pet] 

這樣,我必須保持在兩個可選擇的寵物類型的列表地方(保存的字符串變量和字符串類對的字典的選擇)。有沒有更好的風險和優雅的方式來做到這一點?