在appengine polymodel上覆盖__setitem__是否安全?

时间:2011-12-19 22:20:58

标签: python google-app-engine magic-methods polymodel

我正在为谷歌应用引擎制作一个垃圾邮件过滤器库,它使用应用引擎挂钩在put()进入数据存储区之前修改一些数据。为此,我创建了一个继承PolyModel类的模型,希望可检查的类应该是子类。

但对于课堂上的一些数据,我想在更改值时做一些事情,为此我必须覆盖__setitem__。但我相信sdk使用它来确定模型属性的变化,应用过滤器等,因此更改覆盖__setitem__可能会破坏这一点。最好的方法是什么?

2 个答案:

答案 0 :(得分:2)

如果您不忘记使用super调用父方法,则覆盖方法没有危险。但在你的情况下,__setitem__是错误的地方,因为每当创建实例时,它都会被垃圾邮件清除,即使它是从已经清理过的值创建的。

如果你明确地这样做会有什么问题?

filter_out_spam(obj)
obj.put()

答案 1 :(得分:2)

请勿修改__setitem__ - 写一个符合您要求的custom property class

请记住,如果要在放置记录之前执行操作,则不能仅覆盖模型上的put,因为实体也可以与db.put一起存储。如果可以,您应该通过将相关代码移动到属性类中来避免这种情况。