1 Python类的继承
在OOP(Object Oriented Programming)程序设计中,当我们定义一个class的时候,可以从某个class继承,新的class称为子类(Subclass),而被继承的class称为基类/父类/或者超类(Base Class/Super Class)
class add_base():
def __init__(self,a,b):
self.a=a
self.b=b
def sum(self,c):
return self.a+self.b+c
class add_sub(add_base):
def sum(self,m,n):
return self.a+self.b+m-n
b=add_sub(1,3)
summary=b.sum(1,2)
print(summary)
而我们编写 add_sub 类,完全可以继承 add_base 类(add_sub 就是 add_base);使用 class add_sub(add_base):来表示继承;
继承有什么好处?最大的好处是子类获得了父类的全部属性及功能。如下 add_sub类就可以直接使用父类的 add_base 方法
实例化add_sub的时候,子类继承了父类的构造函数,就需要提供父类要求的两个属性变量:
在继承关系中,如果一个实例的数据类型是某个子类,那它也可以被看做是父类(add_sub既是 子类 又是 父类)。但是,反过来就不行(add_base 仅是 父类,而不是子类)。
继承还可以一级一级地继承下来,就好比从爷爷到爸爸、再到儿子这样的关系。而任何类,最终都可以追溯到根类object,这些继承关系看上去就像一颗倒着的树。比如如下的继承树:
2 类的多态
当子类和父类都存在相同的函数方法时,子类的函数 覆盖了父类的 方法,在代码运行时,会调用子类的函数方法这样,我们就获得了继承的另一个好处:多态。
多态的好处就是,当我们需要传入更多的子类,例如新增 Teenagers、Grownups 等时,我们只需要继承父类的类型就可以了,而函数方法既可以直不重写(即使用Person的),也可以重写一个特有的。这就是多态的意思。调用方只管调用,不管细节,而当我们新增一种子类时,只要确保新方法编写正确,而不用管原来的代码。这就是著名的“开闭”原则:
- 对扩展开放(Open for extension):允许子类重写方法函数
- 对修改封闭(Closed for modification):不重写,直接继承父类方法函数
请看上面代码:我们修改了sum函数方法,最终我们采用了子类的方法,将父类进行覆盖
3 子类从新写构造函数
class add_base():
def __init__(self,a,b):
self.a=a
self.b=b
def sum(self,c):
return self.a+self.b+c
class add_sub(add_base):
def __init__(self,a,b,k):
self.a=a
self.b=b
self.k=k
def sum(self,m,n):
return self.a+self.b+m-n+self.k
b=add_sub(1,2,3)
summary=b.sum(1,2)
print(summary)
也可以这样写:
class add_base():
def __init__(self,a,b):
self.a=a
self.b=b
def sum(self,c):
return self.a+self.b+c
class add_sub(add_base):
def __init__(self,a,b,k):
add_base.__init__(self,a,b)
self.k=k
def sum(self,m,n):
return self.a+self.b+m-n+self.k
b=add_sub(1,2,3)
summary=b.sum(1,2)
print(summary)