我有一个看起来像这样的类:
class MBObject(ndb.Model):
id = ndb.StringProperty()
dictionary = ndb.JsonProperty(indexed=False, default = {})
我想要的是如果有人有一个 MBObject,像这样:
obj = MBObject()
他们访问任何属性,如下所示:
x = obj.author_id
它在幕后这样做:
x = obj.dictionary["author_id"]
所以基本上无论我访问什么属性,它都会在字典中查找该属性,而不是访问类的属性。
这也应该适用于二传手:
x.author_id = 5
应该翻译成
x.dictionary["author_id"] = 5
这在 Python 中是否可行,如果可以,如何实现?
(请不要问为什么,解释太多了)
编辑: 好的,原因如下:
子类在 Google App Engine 中很困难。不可能创建两个不同的分类对象并运行 1 个查询来获取不同类类型的对象,即使它们继承自同一个基类。您必须使用 for 循环来查询,或者使用他们称为 PolyModel 的东西,但这会增加写入成本。
所以我想要的是一个动态类,没有预定义的结构。我不想使用 GAE Expando 类,因为默认情况下所有属性都被索引,这使得写入非常昂贵。(您可以将默认设置为未索引,但我想要一些索引和一些未索引,它不提供)
所以我唯一的选择是将所有属性放入字典中。为了方便起见,我想我必须让它看起来像是面向对象的,并隐藏属性实际上隐藏在字典中的事实。