当前位置:首页 > 开发 > 编程语言 > 编程 > 正文

多重继承真是好哇

发表于: 2007-05-21   作者:huangyiiiiii   来源:转载   浏览:
摘要: 写 model 的时候发现有些东西在重复,第一反应就是写个基类,把这些重复的东西拿出来,然而 Model 类之间继承却不是那么方便的,应该会影响到 ORM 的行为。 怎么办呢?幸好 python 有多重继承。 下面就是项目中做这些重复事情的类: class ModelMixin(object): def save(self): if not self.id: # cr
写 model 的时候发现有些东西在重复,第一反应就是写个基类,把这些重复的东西拿出来,然而 Model 类之间继承却不是那么方便的,应该会影响到 ORM 的行为。
怎么办呢?幸好 python 有多重继承。
下面就是项目中做这些重复事情的类:
class ModelMixin(object):
def save(self):
if not self.id: # creation time
if hasattr(self, 'pubdate'):
self.pubdate = datetime.now()
if hasattr(self, 'pubtime'):
self.pubtime = datetime.now()

if hasattr(self, 'updatedate'):
self.updatedate = datetime.now()
if hasattr(self, 'updatetime'):
self.updatetime = datetime.now()
if hasattr(self, 'number'): # 今天第几次发布
self.number = self.__class__.objects.filter(pubdate=datetime.now()).count()+1

if hasattr(self, 'before_save'):
self.before_save()
super(ModelMixin, self).save()
if hasattr(self, 'after_save'):
self.after_save()

注意:django 将废弃 auto_add 和 auto_now 这些东西,认为太 magic ,建议在 save 中处理,所以上面这个类就更有用了。

怎么用呢?
class Product(ModelMixin, models.Model):
pubdate = models.DateField(u'...', editable=False)
number = models.IntegerField(u'...', editable=False)
...

这样 pubdate 和 number 自然就有了相应的含义了。另外 ModelMixin 还定义了 before_save 和 after_save 的钩子,具体 model 可以在这两个方法里放点代码,比如:
    def before_save(self):
self.totalprice = self.count * self.product.unitprice

...

def after_save(self):
if self._create:
p = OutProduct(postuser=self.postuser,count=1,
pubdate=self.pubdate,mainproduct=self)
p.save()

这些都是项目中直接拷出来的代码,具体意思你就慢慢猜吧,呵呵。

多重继承的实现其实是个还算复杂的过程,复杂的多重继承也会产生一些奇特的行为,不过基本上只要遵守一些良好的习惯(比如常用 super ,虽然写起来有些繁琐),了解一些多重继承的基本原理,基本上不会遇到什么奇怪的问题了。
关于 python 多重继承的实现,请看: The Python 2.3 Mehod Resolution Order

多重继承真是好哇

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号