0

我正在使用Google App Engine多模型對可能具有多個屬性實例的數據進行建模 - 例如,一個聯繫人可能有多個電話號碼。之所以這樣說,是我的設置:如何獲取GAE多模的所有類屬性(包括通過@property定義的那些屬性)

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)} 

有什麼辦法可以訪問ALL屬性,包括那些定義的w ith「@property」?

非常感謝任何幫助或或洞察我要去哪裏錯了。 - 李

UPDATE: 基於@ 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()) 

回答

2

表演Foo._properties應該讓你訪問你在polymodel.PolyModel上定義的從google.appengine.ext.db.Property繼承的任何屬性。

這意味着KeyProperty,StringProperty等將顯示在Foo._properties,所以我假設你現在需要找到所有由property裝飾的方法。

幸運的是,這並不難。首先,快速調整裝飾器(如果你已經知道,請原諒我)。

在python decorators are just syntactic sugar。例如,這兩種方法導致同樣的事情:

@property 
def bar(self): 
    pass 

def bar(self): 
    pass 
bar = property(bar) 

幸運的是,property(obj)返回一個新property對象。這也意味着@property也返回一個property對象。你可以認爲property是一門課程!最後可以使用isinstance(bar, property)查看bar是屬性。

最後,我們可以通過檢查Foo的各個屬性並僅選擇那些屬於property實例的屬性來投入使用。

for attr_name, attr_value in Foo.__dict__.iteritems(): 
    if isinstance(attr_value, property): 
     print attr_name, attr_value 

# bar, <property object at ...> 
+0

FastTurtle:哇,沒想到這個高品質級響應如此之快:非常感謝!我的代碼現在看起來好多了+我更多地瞭解了裝飾器。我編輯了我的答案,以顯示我添加的類方法,以返回屬性objs的屬性和方法。希望這是有道理的。非常感謝您的幫助,非常感謝! :) – pixelphantom

+0

@pixelphantom很高興聽到我的回答很有幫助!你添加的方法看起來不錯,希望能做到你想要的。祝你好運 :) – FastTurtle

相關問題