1

我想要一个名为 MBUser 的基类,它具有一些我不想更改的预定义属性。如果客户端想要向 MBUser 添加属性,建议将 MBUser 子类化,并将任何其他属性放入其中。

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. 什么是解决方法?
4

2 回答 2

3

模型由它们的“种类”定义,子类是不同的种类,即使看起来相同。

子类化的重点不是共享值,而是共享您为给定“种类”创建的“模式”。

在基类上创建了一个种类映射ndb.Model(看起来好像您在使用ndb,因为您提到过get_by_id),并且在您执行这样的查询时会查找每种种类。

对于子类,种类只是定义为类名:

@classmethod
def _get_kind(cls):
  return cls.__name__
于 2012-11-14T19:27:34.567 回答
1

我刚刚发现 GAE 有一个解决方案。它被称为 PolyModel:

https://developers.google.com/appengine/docs/python/ndb/polymodelclass

于 2012-11-14T22:39:45.040 回答