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()


猜你喜欢

转载自www.cnblogs.com/Meanwey/p/9788729.html