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


  • 相关阅读:
    【读书笔记】读《JavaScript模式》
    【读书笔记】读《JavaScript模式》
    【读书笔记】读《JavaScript模式》
    【读书笔记】读《JavaScript模式》
    【读书笔记】读《高性能JavaScript》
    【读书笔记】读《编写高质量代码—Web前端开发修炼之道》
    【读书笔记】读《编写高质量代码—Web前端开发修炼之道》
    【读书笔记】读《JavaScript高级程序设计-第2版》
    在Docker容器中运行.Net Core web Api项目
    [转]安装 Silverlight 5/silverlight4 出错的解决方法
  • 原文地址:https://www.cnblogs.com/Meanwey/p/9788729.html
Copyright © 2020-2023  润新知