• Day18:类的抽象、类的组合应用


    一、抽象类

    1、什么是抽象类

    抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化。

    2、为什么要有抽象类

    如果说类是从一堆对象中抽取相同的内容而来的,那么抽象类是从一堆中抽取相同的内容而来的,内容包括数据属性和函数属性。

      比如我们有香蕉的类,有苹果的类,有桃子的类,从这些类抽取相同的内容就是水果这个抽象的类,你吃水果时,要么是吃一个具体的香蕉,要么是吃一个具体的桃子。。。。。。你永远无法吃到一个叫做水果的东西。

        从设计角度去看,如果类是从现实对象抽象而来的,那么抽象类就是基于类抽象而来的。

      从实现角度来看,抽象类与普通类的不同之处在于:抽象类中只能有抽象方法(没有实现功能),该类不能被实例化,只能被继承,且子类必须实现抽象方法。这一点与接口有点类似,但其实是不同的。

    3、在python中实现抽象类

    #_*_coding:utf-8_*_
    #一切皆文件
    import abc #利用abc模块实现抽象类
    
    class All_file(metaclass=abc.ABCMeta):
        all_type='file'
        @abc.abstractmethod #定义抽象方法,无需实现功能
        def read(self):
            '子类必须定义读功能'
            pass
    
        @abc.abstractmethod #定义抽象方法,无需实现功能
        def write(self):
            '子类必须定义写功能'
            pass
    
    # class Txt(All_file):
    #     pass
    #
    # t1=Txt() #报错,子类没有定义抽象方法
    
    class Txt(All_file): #子类继承抽象类,但是必须定义read和write方法
        def read(self):
            print('文本数据的读取方法')
    
        def write(self):
            print('文本数据的读取方法')
    
    class Sata(All_file): #子类继承抽象类,但是必须定义read和write方法
        def read(self):
            print('硬盘数据的读取方法')
    
        def write(self):
            print('硬盘数据的读取方法')
    
    class Process(All_file): #子类继承抽象类,但是必须定义read和write方法
        def read(self):
            print('进程数据的读取方法')
    
        def write(self):
            print('进程数据的读取方法')
    
    wenbenwenjian=Txt()
    
    yingpanwenjian=Sata()
    
    jinchengwenjian=Process()
    
    #这样大家都是被归一化了,也就是一切皆文件的思想
    wenbenwenjian.read()
    yingpanwenjian.write()
    jinchengwenjian.read()
    
    print(wenbenwenjian.all_type)
    print(yingpanwenjian.all_type)
    print(jinchengwenjian.all_type)

    4、抽象类与接口

    抽象类的本质还是类,指的是一组类的相似性,包括数据属性(如all_type)和函数属性(如read、write),而接口只强调函数属性的相似性。

    抽象类是一个介于类和接口直接的一个概念,同时具备类和接口的部分特性,可以用来实现归一化设计 。

    二、组合的应用

    1、日期类、课程类、人类、老师类、学生类的组合应用

    class Date:   #定义日期类
        def __init__(self,name,year,mon,day):
            self.name=name
            self.year=year
            self.mon=mon
            self.day=day
        def tell_birth(self):
            print('%s %s-%s-%s'%(self.name,self.year,self.mon,self.day))
    class Course:  #定义科目类
        def __init__(self, name, price, period):
            self.name = name
            self.price = price
            self.period = period
        def tell_course(self):
            print('''----------%s info----------
    course name:%s
    course price:%s
    course period:%s''' % (self.name, self.name, self.price, self.period))
    class Person:  #定义人类
        def __init__(self,name,age,sex):
            self.name=name
            self.age=age
            self.sex=sex
            self.courses=[]
        def walk(self):
            print('%s is walking' %self.name)
        def tell_course(self):
            for obj in self.courses:
                obj.tell_course()
    class Teacher(Person):  #定义老师类,继承Person
        def __init__(self,name,age,sex,salary,level):
            Person.__init__(self,name,age,sex)
            self.salary=salary
            self.level=level
        def teach(self):
            print('%s is teaching' %self.name)
        def tell_info(self):
            print('''----------%s info ---------
        NAME:%s
        AGE: %s
        SEX: %s
        SAL: %s
        LEVEL:%s'''%(self.name,self.name,self.age,self.sex,self.salary,self.level))
    class Student(Person):  #定义学生类,继承Person
        def __init__(self,name,age,sex,group):
            Person.__init__(self,name,age,sex)
            self.group=group
        def study(self):
            print('%s is teaching' %self.name)
        def tell_info(self):
            print('''----------%s info ---------
        NAME:%s
        AGE: %s
        SEX: %s
        GROUP: %s'''%(self.name,self.name,self.age,self.sex,self.group))
    
    egon=Teacher('egon',18,'male',3000,10)
    python=Course('Python',15800,'6mons')
    linux=Course('Linux',1800,'3mons')
    egon.courses.append(python)
    egon.courses.append(linux)
    egon.tell_course()
    egon.birth=Date('egon',1991,11,11)
    egon.birth.tell_birth()
    xh=Student('xh',18,'male','group1')
    xh.courses.append(python)
    xh.tell_course()
    xh.tell_info()

    2、序列化

    class Student:
        def __init__(self, name, age, sex, group):
            self.name=name
            self.age=age
            self.sex=sex
            self.group=group
        def study(self):
            print('%s is study' % self.name)
        def tell_info(self):
            print('''
            ----------%s info---------
            NAME:%s
            AGE:%s
            SEX:%s
            group:%s
            ''' %(self.name,self.name,self.age,self.sex,self.group))
    import pickle
    xh=Student('xh',18,'male','group1')
    with open('studentdb.pkl','wb')as f:
        pickle.dump(xh,f)
    with open('studentdb.pkl','rb')as f:
        obj=pickle.load(f)
        obj.tell_info()
  • 相关阅读:
    pormise的基本用法
    let 与 var 的区别
    字符串
    数组
    Redis 低级数据结构:一、介绍
    Curator使用:(七)分布式Barrier
    Curator使用:(六)分布式计数器
    Curator使用:(五)分布式锁
    Curator使用:(四)Master选举
    Curator使用:(三)事件监听
  • 原文地址:https://www.cnblogs.com/Vee-Wang/p/7118339.html
Copyright © 2020-2023  润新知