2009-01-06 25 views
0

我正在創建一個應用程序,我想擁有一組可擴展的屬性(每個RatingProperty)我也想驗證任何動態屬性是RatingProperty類型。如何判斷Expando子類是否具有已定義的屬性?

在Expando的文檔,它說:

提示:如果您要使用Property類驗證動態屬性值,您可以實例屬性類,並呼籲值的validate()方法。

所以,如果我想驗證一個動態屬性,我需要知道類的非動態屬性是什麼。我該如何問我的班級它定義的屬性是什麼?

我曾考慮過創建一個接受字符串的類方法,如果該字符串位於我創建和維護的屬性名稱列表中,則返回true,但它看起來像一個黑客。我已經搜索了谷歌的提示,但沒有任何運氣。

感謝, 帕特

+0

它有助於您用適用的語言標記您的帖子。 – 2011-12-06 00:05:33

回答

1

後了些研究(該死lazyweb!)我已經找到了解決辦法,我認爲是可以接受的:

動態屬性不能是一個子類分貝財產種類。因此,必須採取兩個不同的步驟。首先,你需要創建你的財產類的一個實例,驗證你的價值:

test = db.RatingProperty() 
if test.validate(valueToSave): 
    #do your thing 

接下來,您需要檢查,如果你想救樓市是一個聲明的屬性:

if valueToSaveKey not in myObject.properties(): 
    #if not save it as desired 
    myObject.valueToSaveKey = valueToSave 

的一面這裏是您保存的值不會以您想要的屬性類型存儲。

+0

上面的一行: myObject.valueToSaveKey = valueToSave 應改爲: myObject的.__ SETATTR __(valueToSaveKey,valueToSave) – pat 2009-01-11 17:51:43

+0

可能是更好的編輯你的答案在下一次 - 這樣一來,人們誰只讀答案(這情況多通常你會認爲:))不要跳過評論中可能的重要細節。 – 2010-11-19 04:19:07

0

我可能會誤解你的問題,但如果你有一個你期望找到的屬性列表,爲什麼不使用標準的db.Model而不是Expando?您可以將其他屬性添加到Model類,只要您提供默認值或不要求它們是必需的。

0

這其實很簡單!

ExpandoObject實現(IDictionary<String, Object>)所以你只需要做到這一點:

dynamic person = new ExpandoObject(); 
person.FirstName = "Barack"; 
person.LastName = "Obama" 

(((IDictionary<String, Object>)person).Keys 
    => { "FirstName", "LastName" } 

(((IDictionary<String, Object>)person).ContainsKey("FirstName") 
    => true 

注意:您需要明確地轉換爲(IDictionary<string, object>因爲ExpandoObject明確地實現了這個接口 - 和實例本身不具有ContainsKey()Keys

不要期待這個方法能夠與所有動態對象一起工作 - 只需要ExpandoObject和其他實現這個接口的東西。

1

http://code.google.com/appengine/docs/python/datastore/modelclass.html#Model_properties

db.Model有方法可以找出上的一個實例的所有屬性。

的類公開屬性的對象的列表:db.Model.properties()

實例只公開了動態名稱:實例。dynamic_properties()

你想遍歷列表並生成Property對象,然後運行p.validate()。

for p_name in instance.dynamic_properties(): 
    p = db.RatingProperty() 
    p.validate() # raises BadValueError, etc. 
相關問題