Google App Engine を実行すると、次のようになります。
from google.appengine.ext import db
from google.appengine.ext.db import polymodel
class Father(polymodel.PolyModel):
def hello(self):
print "Father says hi"
class Son(Father):
def hello(self):
print "Spawn says hi"
私が走るとき、例えば
s = Son()
s.put()
son_from_father = Father.get_by_id(s.key().id())
son_from_father.hello()
これは「父がこんにちは」と出力します。これは「息子がこんにちは」と出力することを期待しています。ここで、これを期待どおりに実行する方法を知っている人はいますか?
編集:
問題は、結局のところ、Spawn オブジェクトを Father オブジェクトとして保存していたことにありました。GAE は、Father オブジェクト (私のアプリケーションでは) のプロパティが少ないにもかかわらず、喜んで実行してくれました。保存されているデータから Model.properties() にない値を (黙って) 削除したため、GAE は文句を言いませんでした。
不適切なタイプの保存を修正し、保存されていない余分な値のチェックを追加しました (これは、チェックが行われるはずの TODO コメントでした)。保存時にデータに対して行うチェックは、基本的に次のとおりです。
def save_obj(obj, data, Model):
for prop in Model.properties(): # checks/other things happen in this loop
setattr(obj, prop, data.get(prop))
extra_data = set(data).difference(Model.properties())
if extra_data:
logging.debug("Extra data!")
ここの投稿は役に立ちました - ありがとう。GAE は、指示どおりに使用しているため、期待どおりに動作しています。:)