如何获取GAE多态代码的所有类属性(在Python中),包括通过@property定义的那些

时间:2013-08-16 17:42:59

标签: python google-app-engine google-cloud-datastore app-engine-ndb polymodel

我正在使用Google App Engine多模代建模可以拥有多个属性实例的数据 - 例如联系人可以有多个电话号码。说这是我的设置:

class Foo(polymodel.PolyModel):
    some_prop = ndb.StringProperty()

    @property
    def bar(self):
        return Bar.query(Bar.foo == self.key)

class Bar(ndb.Model):
    foo = ndb.KeyProperty(kind = Foo)
    other_prop= ndb.StringProperty()

(在阅读关于数据建模的GAE文章后,我得到了这种方法:https://developers.google.com/appengine/articles/modeling

现在我做的时候:

Foo._properties

我只能访问以下内容:

{'some_prop': StringProperty('some_prop'), 
 'class': _ClassKeyProperty('class', repeated=True)}

有没有办法访问所有属性,包括用“@property”定义的属性?

非常感谢您对我出错的地方有任何帮助或洞察力。 - 李

更新: 根据@ FastTurle的好答案,我现在添加了一个类方法,它返回类属性以及通过@property标记为属性的方法:

def props(self):
    return dict(self._properties.items() +  \
                   {attr_name:getattr(self,attr_name) for \
                    attr_name, attr_value in \
                    Foo.__dict__.iteritems() if \
                    isinstance(attr_value,property)}.items())

1 个答案:

答案 0 :(得分:2)

执行Foo._properties可让您访问从polymodel.PolyModel继承的google.appengine.ext.db.Property上定义的任何属性。

这意味着KeyPropertyStringProperty等会出现在Foo._properties中,所以我假设你现在需要找到{{1}所装饰的所有方法}}

幸运的是,这并不难。首先,快速了解装饰者(如果您已经知道这一点,请原谅我。)

在python decorators are just syntactic sugar中。例如,这两种方法产生相同的结果:

property

幸运的是,@property def bar(self): pass def bar(self): pass bar = property(bar) 会返回一个新的property(obj)对象。这也意味着property也会返回@property个对象。您可以将property视为一个类!最后可以使用property查看isinstance(bar, property)是否为属性。

最后,我们可以通过检查每个bar的属性并仅选择那些Foo个实例来使用它。

property