make

まけ

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の属するクラスかサブクラスでなければダメっぽい.
(親はダメ)


これができることによって,名前ベースのポリモーフィズムの恩恵にあずかれそうな予感がする.