我的代码实现多态模型有多难看?

时间:2010-04-21 06:34:44

标签: google-app-engine google-cloud-datastore polymorphism

我正在使用Polymorphic Models

简单问题:下面我的代码在不使用下面的这一行的情况下工作,我在其他人的代码中看到了这一点。该怎么办?

#super(GeneralModel, self).__init__(*args, **kwargs)

凌乱的问题:我感觉下面的代码虽然看起来有效,但并不是最美丽的解决方案。

我正在做的事情的概要:我基于发布到服务器的'unclean'JSON对象实例化(或制作)新的数据存储模型实体。 1,我想做一般(或超级)模型中指定的一般输入数据清理,然后第二次做一些特殊方法,在每个特殊(或子类)模型中指定为def parse

class GeneralModel(polymodel.PolyModel):
 lat_long_list = db.ListProperty(db.GeoPt)
 zooms = db.ListProperty(int)

     def __init__(self, *args, **kwargs):
  self.lat_long_list = [ db.GeoPt( pt[0] , pt[1] ) for pt in zip( kwargs["lat"] , kwargs["lon"] ) ]
  del kwargs["lat"]
  del kwargs["lon"]
  if "zooms" not in kwargs: kwargs["zooms"] = ZOOMS # some default
  for property,value in kwargs.items():
   setattr(self,property,value)
  #super(NamedModel, self).__init__(*args, **kwargs)
  self.parse()

 def parse(self):
         raise NotImplementedError('Need to define this for each category')


class SpecialModel(GeneralModel):
 stringText = db.StringProperty()
 words_list = db.StringListProperty()

 def parse( self ):
  self.words_list = self.stringText.split(",")  

这就是我测试我的代码是否有效的方式:

>>>kwargs={'stringText':'boris,ted','lat':[0,1,2,3],'lon':[0,1,2,8],'zooms':[0,10]}
>>>entity=SpecialModel(key_name="tester",**kwargs)
>>>entity.words_list
['boris', 'ted']

1 个答案:

答案 0 :(得分:1)

'super'行调用父实体的构造函数。如果不包含它,则不会调用父构造函数,并且不会正确初始化模型。事实上,在你自己初始化之前,你应该首先调用

但是,强烈建议不要在模型上覆盖构造函数。构造函数不仅在调用时使用,而且还由系统构建,用于构造从数据存储区加载的实例,在后一种情况下,参数 - 和预期的行为 - 是不同的,并且依赖于实现。

相反,您应该定义一个工厂方法,如下所示:

class MyModel(db.PolyModel):
  @classmethod
  def create(cls, foo, bar):
    # Do some stuff
    return cls(foo, bleh)