Python进阶-----类的继承、接口继承及归一化设计
一、什么是继承
类的继承:继承是一种创建新类的方式,新建的类可以继承一个或多个父类(python支持多继承),父类又可称为基类或超类,新建的类
称为派生类或子类。子类会“遗传”父类的属性,从而解决代码重用问题
python中类的继承分为:单继承和多继承
1 class Father:
2 money = 10000
3 def __init__(self,father_name,father_age):
4 self.father_name = father_name
5 self.father_age = father_age
6 def hit_son(self):
7 print('爸爸打儿子')
8
9 class Son(Father): #该处即为子类继承父类()中为父类名
10 pass #在类后面括号中写入另外一个类名,表示当前类继承另外一个类
11
12 s = Son('Meanwey',24) #实例化子类时,传入的是父类的init需要的参数
13 s.hit_son() #继承了父类hit_son方法
14 print(s.money) #继承了父类的类的数据属性
15 print(s.father_age) #继承了父类的实例的数据属性
16 s.money = 20000 #给实例增加数据属性money,但是不会改变父类的属性
17 print(Father.money,Son.money) #>>> 10000 10000因为Son子类中没有money数据变量,则向上寻找Father中的money
18 #可以发现
二、什么时候用继承
1、当类之间有显著不同,并且较小的类是较大的类所需要的组件时,用组合比较好。
例如:描述一个机器人类,机器人这个大类是由很多互不相关的小类,如机械胳膊类、腿类,身体类、电池类等
2、当类之间有很多相同的功能,提取这些共同的功能做成的基类,用继承比较好。
例如:猫 喵喵叫、吃、喝、拉、撒
狗 汪汪叫、吃、喝、拉、撒
1 class Animal: #定义了一个基类(父类),提取他们共有的属性,都是动物,都会吃喝拉撒
2 def eat(self):
3 print('%s 吃'%self.name)
4 def drink(self):
5 print('%s 喝' % self.name)
6 def shit(self):
7 print('%s 拉' % self.name)
8 def pee(self):
9 print('%s 撒' % self.name)
10
11 class Cat(Animal): #定义了猫这一子类,并继承了动物Animal这一父类
12 def __init__(self,name):
13 self.name = name
14 self.breed = '猫'
15 def cry(self):
16 print('喵喵叫~~')
17
18 class Dog(Animal): #定义了狗这一子类,并继承了动物Animal这一父类
19 def __init__(self,name):
20 self.name = name
21 self.breed = '狗'
22 def cry(self):
23 print('汪汪叫~~')
24
25 ###########执行################
26 c1 = Cat('小白家的小黑猫')
27 c1.eat()
28 c1.cry()
29
30 c2 = Cat('小黑家的小白猫')
31 c2.drink()
32 c2.cry()
33
34 d1 = Dog('胖子家的小瘦狗')
35 d1.shit()
36 d1.cry()
三、继承同时具有两种含义
1、继承基类(父类)的方法,并作出自己改变(派生)或者扩展(代码重用);
2、声明某个子类兼容于某基类,定义了一个接口类,子类继承接口类,并且实现接口中定义的方法。(称为接口继承)
四、派生
派生就是子类在继承父类的基础上衍生出新的属性。子类中独有的,父类中没有的;或子类定义与父类重名的东西。子类也叫派生类。
五、接口继承与归一化
抽象:即提取类似的部分
接口:就是一个函数
接口继承:定义一个基类,在基类中利用装饰器(@abc.abstractclassmethod)将自己函数定义成接口函数,在子类中继承该基类,
则该子类必须实现接口函数,否则无法实例化。
接口继承实质上是要求“作出一个良好的抽象,这个抽象规定了一个兼容接口(接口函数--只提供函数名,不提供具体功能),使得
外部调用者无需关心具体细节,可一视同仁的处理实现了特定接口的所有对象”---这个在程序设计上就叫做归一化。
也就是在父类里要求子类必须实现的功能,但是子类可以不实现,所以需要模块 import abc,这样使得父类具有限制子类必须实现规定的方法
,具体实现如下:
1 import abc
2 class All_file(metaclass=abc.ABCMeta): #定义基类,且基类不需要实例化
3 @abc.abstractclassmethod #利用该装饰器定义了接口函数
4 def read(self): #这样的话,子类必须实现该函数,不实现,则子类无法实例化
5 pass
6
7 @abc.abstractclassmethod
8 def write(self): #定义write接口函数
9 pass
10
11 class Txt(All_file): #定义子类
12 def read(self): #子类中必须实现All_file基类中的接口函数read()
13 print('文本数据的读取方法')
14 def write(self):
15 print('文本数据的写入方法')
16
17 class Disk(All_file):
18 def read(self):
19 print('磁盘数据的读取方法')
20 def write(self):
21 print('磁盘数据的写入方法')
22
23 t1 = Txt()
24 t1.read()