`
huangyiiiiii
  • 浏览: 119414 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
社区版块
存档分类
最新评论

多重继承真是好哇

阅读更多
写 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
分享到:
评论

相关推荐

    C++编程思想--多重继承

    【C++编程思想--多重继承】 多重继承是C++中的一种特性,允许一个类可以从多个基类中继承属性和行为,从而实现代码复用和设计灵活性。这种机制使得类能够结合多个基类的功能,但同时也引入了一些复杂性和潜在的问题...

    面向对象之二 继承(多重继承)

    这些子类可能通过多重继承从其他类(如Engine、Transmission、Wheels)中获取特定功能,以便更好地表示和操作各种类型的汽车。通过这种方式,我们可以在不重复代码的情况下,为每种类型的汽车提供定制化的功能。

    多重继承 面向对象 实验报告

    面向对象编程中的多重继承是一种允许一个子类继承多个父类特性的机制,这在C++等支持多继承的编程语言中是非常重要的概念。在实验报告中,学生被要求熟悉并应用这种机制,通过设计一系列相关的类来展示其功能。 ...

    C++习题 多重继承

    根据给定的信息,我们可以分析并总结出以下关于C++中多重继承的知识点: ### C++多重继承概述 在C++中,多重继承是指一个派生类可以有多个基类的情况。这种方式可以让派生类继承多个基类的特性,从而实现代码的...

    实现c++类的多重继承的例程

    在C++编程语言中,多重继承是一种特性,允许一个派生类从多个基类中继承属性和行为。这种设计模式增强了代码的复用性,并且能够构建复杂的类层次结构。以下是一个关于如何实现C++类的多重继承的详细解释。 首先,让...

    多重继承(6_7钻石继承问题)_C++_

    在C++编程语言中,多重继承是一个特性,允许一个类(子类)继承自多个基类(父类)。这种设计模式使得子类可以同时获得多个基类的特性,增加了代码的复用性。然而,多重继承也带来了一些复杂性和潜在的问题,其中最...

    VC8.0上多重继承的内存布局

    在探讨“VC8.0上多重继承的内存布局”这一主题时,我们深入研究了C++语言中多重继承机制下的对象内存布局与虚函数表(virtual table)的组织方式,这是理解并有效利用C++多态性的关键。下面将详细阐述多重继承下对象的...

    实现C++类的多重继承

    在C++编程语言中,多重继承是一种特性,允许一个派生类从多个基类继承属性和行为。这种机制使得代码重用更为灵活,能够构建更复杂的类层次结构。本篇文章将详细探讨C++中的多重继承及其相关的实现细节。 首先,我们...

    多重继承.doc

    ### 多重继承 多重继承是面向对象编程语言中的一个重要概念,允许一个派生类同时继承多个基类的属性和方法。在C++等支持多重继承的语言中,这一特性为程序设计提供了极大的灵活性,但同时也增加了复杂性,尤其是在...

    分别声明Teacher(教师)类和Cadre(干部)类,采用多重继承方式由这两个类派生出新类Teacher_Cadre(教师兼干部)。要求:①在两个基类中都包含

    分别声明Teacher(教师)类和Cadre(干部)类,采用多重继承方式由这两个类派生出新类Teacher_Cadre(教师兼干部)。要求:①在两个基类中都包含一部分相同名字的数据成员name(姓名),age(年龄)和成员函数...

    VC 实现C 类的多重继承.rar

    VC 实现C 类的多重继承,cout(1,1,2008,11,12,12);//直接使用DateTimeType构造函数设置日期时间  cout();//显示时间日期  dt.SetDate(8,8,2008);//调用基类的成员函数修改日期  dt.SetTime(20,8,8);//调用基类...

    多重继承和虚继承.doc

    多重继承和虚继承是C++中两种高级的继承方式,它们允许类从多个基类中获取属性和行为,但同时也引入了一些复杂性和潜在的问题。 **多重继承** 是指一个类可以从多个基类派生,从而获得多个基类的特性。在多重继承中...

    vs2008 多重继承虚基类的简单应用

    在C++编程中,多重继承和虚基类是两种重要的特性,它们允许一个类可以从多个父类中继承属性和行为。Visual Studio 2008(VS2008)作为一个强大的开发环境,支持这些高级的面向对象特性,使得开发者能够创建复杂的...

    Python多重继承使用方法共2页.pdf.zip

    在Python中,多重继承是面向对象编程的一个重要特性,它允许一个子类(派生类)继承多个父类(基类)的属性和方法,从而实现代码复用和模块化设计。这个压缩包文件"Python多重继承使用方法共2页.pdf.zip"很可能是...

    c++多重继承

    类的多重继承演示"<<endl; CDateTimeType dt 1 1 2008 11 12 12 ; 直接使用DateTimeType构造函数设置日期时间 cout<<"调用CDateTimeType类构造函数设定的初始日期 时间为:"<<...

    类多重继承的模糊性的消除

    类多重继承的模糊性的消除,类多重继承的模糊性的消除

    C++虚拟多重继承对象模型讨论-样例

    在C++编程语言中,虚拟多重继承(Virtual Multiple Inheritance,VMI)是一种高级特性,它允许一个类从多个基类继承,其中一个或多个基类可能是通过其他基类间接继承的。这种继承方式的主要目的是解决“菱形问题”...

Global site tag (gtag.js) - Google Analytics