My favorites | 中文(繁體) | Sign in
英文版或許有比此中譯版新的內容

Expando 類別

Expando 類別是資料模型 (其屬性是動態決定) 定義的超級類別。 Expando 模型可以是下例的組合:類似 Model 的固定屬性以及在執行階段所指派的動態屬性。

Expando 是由 google.appengine.ext.db 模組所提供。

Expando 是 Model 的子類別,並從該類別繼承其類別和實例方法。Expando 類別不會定義或覆寫任何方法。

簡介

Expando 模型可具有固定和動態屬性。固定屬性行為會類似 Model 的屬性,且同樣地使用類別屬性 (attribute) 在 Expando 模型中定義。在實例中將值指派給動態屬性時,就會建立該動態屬性。相同 Expando 類別的兩個實例,可以具有不同的動態屬性集,而且甚至可以具有相同名稱但不同類型的動態屬性。動態屬性是選用的,而且沒有預設值:指派值之後,動態屬性才會存在。

動態屬性不能使用 Property 實例來執行驗證、設定預設或為值套用自動邏輯。動態屬性只會儲存支援資料存放區類型的值。請參閱類型和 Property 類別

另外,與固定屬性不同的是,動態屬性不能為類別屬性 (attribute) 和資料存放區屬性使用不同的名稱。請參閱不允許的屬性名稱

提示:若要使用 Property 類別來驗證動態屬性值,您可以具現化 Property 類別,並對該值呼叫其 validate() 方法。

Expando 子類別可以定義類似 Model 類別的固定屬性。固定屬性的 Expando 行為會類似於 Model 的屬性。Expando 實例可以同時具有固定和動態屬性。

import datetime

class Song(db.Expando):
  title = db.StringProperty()

crazy = Song(title='Crazy like a diamond',
             author='Lucy Sky',
             publish_date='yesterday',
             rating=5.0)

hoboken = Song(title='The man from Hoboken',
               author=['Anthony', 'Lou'],
               publish_date=datetime.datetime(1977, 5, 3))

crazy.last_minute_note=db.Text('Get a train to the station.')

Expando 實例的動態 (非固定) 屬性可以被刪除。若刪除動態屬性,則應用程式會刪除實例的屬性 (attribute):

del myobj.myprop

建構函式

Expando 類別的建構函式定義如下:

class Expando(parent=None, key_name=None, **kw)

模型類別的屬性,在使用之前,不需要在類別中定義。就像 Model,Expando 類別必須是子類別,以定義資料實體的種類。

Expando 是 Model 的子類別,並繼承或覆寫其方法。

引數:

parent
實體的 Model 實例或 Key 實例是新實體的父項 (parent)。
key_name

新實體的名稱。名稱會成為主要金鑰的一部分。若為 None,則會使用系統產生的 ID 做為金鑰。

key_name 值的開頭不能是數字,而且不能是 (__*__) 型式。 若您的應用程式以使用者提交的資料做為資料存放區實體金鑰名稱 (例如電子郵件地址),則應用程式要先處理好該值,例如加上已知字串的首碼 (像是「key:」),以符合這些要求。

key_name 會儲存為 Unicode 字串,而 str 值會轉換為 ASCII 文字。

**kw
實例屬性的初始值 (做為 keyword 引數)。每個名稱會與新實例的屬性 (attribute) 相關,可能是與 Expando 類別中定義的固定或動態屬性相關。