我正在为谷歌应用引擎制作一个垃圾邮件过滤器库,它使用应用引擎钩子在一些数据put()
进入数据存储区之前对其进行修改。为此,我创建了一个子类化 PolyModel 类的模型,希望可检查的类应该子类化。
但是对于类中的某些数据,我想在值更改时做一些事情,为此我必须覆盖__setitem__
. 但我相信 sdk 使用它来确定模型属性的变化、应用过滤器等,因此更改覆盖__setitem__
可能会破坏这一点。解决这个问题的最佳方法是什么?
我正在为谷歌应用引擎制作一个垃圾邮件过滤器库,它使用应用引擎钩子在一些数据put()
进入数据存储区之前对其进行修改。为此,我创建了一个子类化 PolyModel 类的模型,希望可检查的类应该子类化。
但是对于类中的某些数据,我想在值更改时做一些事情,为此我必须覆盖__setitem__
. 但我相信 sdk 使用它来确定模型属性的变化、应用过滤器等,因此更改覆盖__setitem__
可能会破坏这一点。解决这个问题的最佳方法是什么?
重写方法没有危险,如果您不忘记使用super
. 但在你的情况下__setitem__
是错误的地方,因为每次创建实例时,它都会从垃圾邮件中清除,即使它是从已经清除的值创建的。
如果你明确地这样做有什么问题?
filter_out_spam(obj)
obj.put()
不要修改__setitem__
- 而是编写一个自定义属性类来执行您想要的操作。
请记住,put
如果您想在放置记录之前执行操作,则不能只覆盖模型,因为实体也可以使用db.put
. 如果可以,您应该通过将相关代码移动到属性类中来避免这样做。