继承
1.隐式继承( Implicit Inheritance)
首先我将向你展示当你在父类里定义了一个函数,但没有在子类中定义的例子,这时候会发生隐式继承。
2.显式覆写( Explicit Override)
有时候你需要让子类里的函数有一个不同的行为,这种情况下隐式继承是做不到的,而你需要覆写子类
中的函数,从而实现它的新功能。你只要在子类 Child 中定义一个相同名称的函数就可以了
3.在运行前或运行后覆写
第三种继承的方法是一个覆写的特例,这种情况下,你想在父类中定义的内容运行之前或者之后再修改
行为。
1 class parent(object): 2 def override(self): 3 print ‘parent override()‘ 4 def implicit(self): 5 print ‘parent implicit()‘ 6 def alter(self): 7 print ‘parent alter()‘ 8 class child(parent): 9 def override(self): 10 print ‘child override()‘ 11 def alter(self): 12 print ‘before parent alter‘ 13 super(child,self).alter() 14 print ‘after parent alter‘ 15 16 dad=parent() 17 son=child() 18 19 #隐式继承 20 dad.implicit() 21 son.implicit() 22 #显示继承 23 dad.override() 24 son.override() 25 26 dad.alter() 27 son.alter()
注意:
最常见的 super() 的用法是在基类的 __init__ 函数中使用。 通常这也是唯一可以进行这种操作的地方,
在这里你在子类里做了一些事情, 然后完成对父类的初始化。这里是一个在 Child 中完成上述行为的例
子:
1 class Child(Parent): 2 def __init__(self, stuff): 3 self.stuff = stuff 4 super(Child, self).__init__()
这和上面的 Child.alter 差别不大, 只不过我在 __init__ 里边先设了个变量, 然后才用
Parent.__init__ 初始化了 Parent 。
=============================================================================
=============================================================================
合成
合成和继承差不多,可以实现相同的功能,就是直接使用别的类或者模块,而非依赖于继承。
继承中三种有两种是通过新代码取代或者修改父类的功能,这其实可以通过调用模块里面的函数来实现。
1 class Other(object): 2 def override(self): 3 print ‘other override()‘ 4 def implicit(self): 5 print ‘other implicit()‘ 6 def alter(self): 7 print ‘other alter()‘ 8 class child(object): 9 def __init__(self): 10 self.other=Other() 11 def override(self): 12 self.other.override() 13 def implicit(self): 14 print ‘child implicit()‘ 15 def alter(self): 16 print ‘before child alter()‘ 17 self.other.alter() 18 print ‘after child alter()‘ 19 20 son = child() 21 son.override() 22 son.implicit() 23 son.alter() 24
=============================================================================
=============================================================================
继承和组合的应用场合
1. 不惜一切代价地避免多重继承,它带来的麻烦比能解决的问题都多。如果你非要用,那你得准备
好专研类的层次结构,以及花时间去找各种东西的来龙去脉吧。
2. 如果你有一些代码会在不同位置和场合应用到,那就用合成来把它们做成模块。
3. 只有在代码之间有清楚的关联,可以通过一个单独的共性联系起来的时候使用继承, 或者你受现
有代码或者别的不可抗拒因素所限非用不可的话,那也用吧。