父类和子类有三种交互方式:
- 子类动作完全等同于父类动作
- 子类动作完全覆盖了父类动作
- 子类动作完全替换了父类动作
隐形继承
如果将函数放到基类中,那么所有的子类将会自动获得这些函数功能。需要很多类的时候,这样可以重复写很多代码。
class Parent(object):
def implicit(self):
print("PARENT implicit()")
class Child(Parent):
pass
dad=Parent()
son=Child()
dad.implicit()
son.implicit()
显性覆盖
使函数调用有不同的行为
class Parent(object):
def override(self):
print("PARENT override()")
class Child(Parent):
def override(self):
print("CHILD override()")
dad=Parent()
son=Child()
dad.override()
son.override()
在运行前或运行后替换
覆盖的特例,在父类定义的内容运行之前或之后再修改行为
class Parent(object):
def altered(self):
print("PARENT altered()")
class Child(Parent):
def altered(self):
print("CHILD,BEFORE PARENT altered()")
super(Child,self).altered()#用super来获取Parent.altered这个版本
#child和self两个参数调用super,在此返回的基础上调用altered
print("CHILD,AFTER PARENT altered()")
dad=Parent()
son=Child()
dad.altered()
son.altered()
要用super的原因
- 首先要理解多重继承
多重继承:定义的类继承了一个或多个类(例子如下)
class SuperFun(Child,Badstuff):
pass
- 利用super()解决继承关系
super()和__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()
区别于parent:只是利用other来完成它的功能
继承和组合指导原则
- 不惜一切代价避免多重继承,因为它太复杂以至于很不可靠。如果非要用,那得准备好钻研类层次结构,以及花时间去找各种东西的来龙去脉。
- 如果有一些代码会在不同场合和位置应用到,那就用组合把他们做成模块。
- 只有在使用的可复用部分之间有清晰的关联,可以通过一个单独的共性联系起来的时候,才使用继承,或者,现有代码或者别的不可抗拒因素所限非用继承不可,那就去用吧。