db.Modelの子クラスオブジェクトは親クラスのget()でも取得できる
子クラスのgetでも取り出せるが,実は親クラスのgetでも取り出せるみたい.
関係ないクラスのgetで取り出そうとすると,
KindError: Kind 'FirstClass' is not a subclass of kind 'UserData'
というエラーメッセージが出る.
逆に言えば,subclassならばOKってことみたい.
詳細
google app egnineのデータベースdatastoreにデータを保存するためには、db.Modelクラスを継承したクラスのオブジェクトを使う。
例えば、db.Modelを継承したBaseDataクラスを作る.
class BaseData(db.Model): id = db.StringProperty() name = db.StringProperty()
これで,String型のid,nameという2つのプロパティをもったモデルを作成できる.
保存するときは
bd = BaseData() bd.id="0" bd.name="base0" bd.put()
としてやればよい.
さらに,このBaseDataを継承したクラスを作ることができる.
class FirstClass(BaseData): def getId(self): return self.id def getName(self): return self.name
もちろん,datastoreに保存できる.
fs = FirstClass() fs.id="1" fs.name="first" fs.put()
保存したデータは,keyを使ってオブジェクトとしてdatasotreから取り出せる.
例えば,BaseDataのkeyの配列bd_key_listがあるとすると,
base_data_list = BaseData.get(bd_key_list)
でリストとして取り出せる.
さらに,継承したモデルFirstClassのkeyのリストfc_key_listがあるとき,
fc_data_list = BaseData.get(fc_key_list)
で取り出せる.
例えばkeyのリストにBaseDataオブジェクトとFirstClassオブジェクトの両方が混ざっていても,BaseData.get()で取り出せる.
この場合,FirstClass.get()をすると,BaseDataのkeyを評価するときに例外が発生する.
getの属するクラスかサブクラスでなければダメっぽい.
(親はダメ)
これができることによって,名前ベースのポリモーフィズムの恩恵にあずかれそうな予感がする.