2012-11-14 67 views
1

我想要一個名爲MBUser的基類,它具有一些預定義的屬性,我不想更改這些屬性。如果客戶想要將屬性添加到MBUser,則建議MBUser被子類化,並且將其中的任何其他屬性放在該處。Google App Engine基礎和子類獲取

API代碼將不知道客戶端是否實際上是MBUser的子類,但它應該沒有關係。這個想法讓我們可以通過id獲得MBUser。所以我期望這個工作:

def test_CreateNSUser_FetchMBUser(self): 
    from nsuser import NSUser 
    id = create_unique_id() 
    user = NSUser(id = id) 
    user.put() 
    # changing MBUser.get.. to NSUser.get makes this test succeed 
    get_user = MBUser.get_by_id(id) 
    self.assertIsNotNone(get_user) 

這裏NSUser是MBUser的子類。測試失敗。

  1. 爲什麼我不能這樣做?
  2. 什麼是解決方法?

回答

3

模型由它們的「種類」定義,而子類是不同的類型,即使它看起來相同。

子類化的要點不是共享值,而是共享您爲給定「種類」創建的「模式」。

一類地圖是在基類ndb.Model創建(好像你正在使用ndb既然你提到get_by_id),當你做這樣的查詢每一種是擡頭。

對於子類,一種是剛剛defined類名:

@classmethod 
def _get_kind(cls): 
    return cls.__name__