Expando 類別

附註:強烈建議建構新應用程式的開發人員使用 NDB 用戶端程式庫;相較於此用戶端程式庫,NDB 用戶端程式庫有幾項優點,例如能透過 Memcache API 自動快取實體。如果您目前使用的是舊版 DB 用戶端程式庫,請參閱 DB 至 NDB 遷移指南

有些資料模型定義的屬性是以動態方式決定的,而 Expando 類別是這類定義的超類別。Expando 模型可同時具有類似 Model 的固定屬性以及在執行階段指派給實體的動態屬性。

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

Expando 是 Model 的子類別,會沿用 Model 類別的類別和例項方法。Expando 類別不會定義或覆寫任何方法。

簡介

Expando 模型可具有固定屬性和動態屬性。固定屬性的行為與 Model 屬性類似,且在 Expando 模型類別中是使用類別屬性以類似方式定義。動態屬性則是在例項中獲指派值時建立。相同 Expando 類別的兩個例項可有不同的動態屬性組合,甚至可具有名稱相同但類型不同的動態屬性。動態屬性一律是選用屬性,且沒有預設值:這些屬性在獲指派值之前並不存在。

動態屬性不可使用 Property 例項執行驗證作業、設定預設值,或為值套用自動邏輯,而只會儲存受支援資料儲存庫類型的值。詳情請參閱類型和 Property 類別一文。

此外,不同於固定屬性,動態屬性無法針對類別屬性和資料儲存庫屬性使用不同名稱。詳情請參閱不允許的屬性名稱一文。

提示:如果您想使用 Property 類別驗證動態屬性值,可以將 Property 類別實例化,並針對值呼叫 Property 類別的 validate() 方法。

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

import datetime

from google.appengine.ext import db

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 例項的動態 (非固定) 屬性是可以刪除的。為刪除動態屬性,應用程式會刪除例項的屬性:

del crazy.last_minute_note

建構函式

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

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

不需要在使用前先於類別中定義屬性的模型類別。如同 Model,Expando 類別必須變成子類別才能定義資料實體的種類。

Expando 是 Model 的子類別,會沿用或覆寫 Model 類別的方法。

引數

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

新實體的名稱。這個名稱會成為主要金鑰的一部分。如果值為 None,金鑰會使用系統產生的 ID。

key_name 值的開頭不得為數字,且格式不得為 __*__。如果您的應用程式是以使用者提交的資料做為資料儲存庫實體金鑰名稱 (例如電子郵件地址),應用程式應先對值進行處理以滿足這些要求,例如在前方加上「key:」等已知字串。

key_name 是以 Unicode 字串形式儲存,str 值會轉換成 ASCII 文字。

**kwds
例項屬性的初始值,形式為關鍵字引數。每個名稱會對應到新例項的屬性,且可對應到 Expando 類別中定義的固定屬性或本身是動態屬性。
本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Python 2 適用的 App Engine 標準環境