我们的OOP程序员,就像英雄永远会遇险一样,总会遇到叫继承的“天险”。
老道的程序员会尽力避开这道天险,因为他们知道这里水有多深。
直接说结论吧:所有继承都能用合成来替代,而多重继承无论如何都要避免。
主要概念及其英文
- 类:class
- 继承:inheritance
- 合成:composition
继承
继承意思是一个子类会“继承”母类的大多数特征。子母类的交互方式有:子imply/override/alter母的action。
- 隐式继承(implicit): 当你调用子类的一个函数,python会先在子类中找,如果子类没有,会再去母类中找。若在母类中找到,则属于implicit
- 显示复盖(override):在子类定义母类中有的一个函数,python在子类找到后,就直接用了。也就是覆盖了母类的这个函数
- 改动(alter):使用super函数
ex44_inherit.py
class Parent(object):
def implicit(self):
print("PARENT implicit()")
def override(self):
print("PARENT override()")
def altered(self):
print("PARENT altered()")
class Child(Parent):
def override(self):
print("CHILD override()")
def altered(self):
print("CHILD, BEFORE PARENT altered()")
super(Child, self).altered()
print("CHILD, AFTER PARENT altered()")
dad = Parent()
son = Child()
dad.implicit()
son.implicit()
dad.override()
son.override()
dad.altered()
son.altered()
为啥用 super()
书里大概是说可以用来处理多重继承:
class SuperFun(Child, BadStuff):
pass
且多重继承多半用于如下情况。
using super() with __init__
class Child(Parent):
def __init__(self, stuff):
self.stuff = stuff
super(Child, self).__init__()#
然而没说在多重继承中怎么用。
合成
合成也能完成继承的任务,比如:
class Other(object):
def override(self):
print("OTHER override()")
def implicit(self):
print("OTHER implicit()")
def altered(self):
print("OTHER altered()")
class Child(object):
def __init__(self):
self.other = Other()
def implicit(self):
self.other.implicit()
def override(self):
print("CHILD override()")
def altered(self):
print("CHILD, BEFORE OTHER altered()")
self.other.altered()
print("CHILD, AFTER OTHER altered()")
son = Child()
son.implicit()
son.override()
son.altered()
这个Other类可以另存为.py文件,然后当做模块导入。或许就叫other.py?
继承还是合成?
-
极力避免多重继承——它要花很多精力去学习,却只能带来一点方便
-
如果要在许多不同且无关的情况下用到重复的代码,请使用合成处理代码。
-
只有在代码之间可以用一个变量连接或非用不可时,才去用继承
不要成为规则的奴隶,该用还是要用的。比如你的合作者或同事已经用了多重继承去写代码。
课后作业
阅读python的代码规范,尽力按其中的要求写代码。