0

我有一个看起来像这样的类:

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 类,因为默认情况下所有属性都被索引,这使得写入非常昂贵。(您可以将默认设置为未索引,但我想要一些索引和一些未索引,它不提供)

所以我唯一的选择是将所有属性放入字典中。为了方便起见,我想我必须让它看起来像是面向对象的,并隐藏属性实际上隐藏在字典中的事实。

4

1 回答 1

1

当然,您可以使用 Python 的一种神奇方法轻松做到这一点:

__getattr__()

http://www.rafekettler.com/magicmethods.html#access

只需在您的对象中定义它并为其提供您想要的功能:

class MBObject(ndb.Model):

  def __getattr__(self, name):
     if name in self.dictionary:
       return self.dictionary.get(name)
     else:
       raise AttributeError
于 2012-11-30T00:41:41.883 回答