• python基础之组合继承多态


    组合

    1.什么是组合

             组合就是一个类的对象具备一个指向另外一个类的对象的属性

    2.为何用组合

             组合可以减少代码冗余

    3.如何使用

    class People:
        def __init__(self,name,age,sex):
            self.name=name
            self.age=age
            self.sex=sex
    class Course:
        def __init__(self,name,period,price):
            self.name=name
            self.period=period
            self.price=price
        def tell_info(self):
            print('<%s %s %s>' %(self.name,self.period,self.price))
    class Teacher(People):
        def __init__(self,name,age,sex,job_title):
            People.__init__(self,name,age,sex)
            self.job_title=job_title
            self.course=[]
            self.students=[]
    class Student(People):
        def __init__(self,name,age,sex):
            People.__init__(self,name,age,sex)
            self.course=[]
    egon=Teacher('egon',18,'male','沙河霸道金牌讲师')
    s1=Student('牛榴弹',18,'female')
    
    python=Course('python','3mons',3000.0)
    linux=Course('python','3mons',3000.0)
    
    #为老师egon和学生s1添加课程
    egon.course.append(python)
    egon.course.append(linux)
    s1.course.append(python)
    #为老师egon添加学生s1
    egon.students.append(s1)
    
    #使用
    for obj in egon.course:
        obj.tell_info()

    菱形继承问题        非菱形继承都是深度优先

    1.什么是菱形继承问题?

             一个子类继承多个父类,最终继承同一个类

    2.python2中分经典类和新式类

             经典类按深度优先查找属性

             新式类按广度优先查找属性

    注意:按照发起查找的类为准,父类中既有新式类,又有经典类与查找的方式无关

    在子类派生出的新功能中,重用父类功能的方式有两种

    1.指名道姓地访问(与继承无关)

    2.严格依赖继承属性的查找关系

    super()会得到一个特殊的对象,该对象就是专门用来访问父类中的属性的(按照继承关系)

    super()__init__(name,age,) 不需要传self,已经自动传入

    注意:在python2中需要写完整super(自己的类名,self)__init__(name,age,)

    super()谁查找就会以谁的mro()为准,碰到super()会按当前的位置继续往后找

    多态与多态性

    1.什么是多态与多态性?

             多态指的是同一种事物的各种形态

             如水可以有固态,液态,气态

             多态性:继承同一个类的多个子类中有相同的方法名,那么子类产生的对象都能不考虑具体的类型而直接调用父类的功能

    抽象类

    import abc #利用abc模块实现抽象类

    class All_file(metaclass=abc.ABCMeta):  # 用于限制子类的定义

        all_type='file'

        @abc.abstractmethod #定义抽象方法,无需实现功能

        def read(self):

            '子类必须定义读功能'

            Pass

    python中不推荐使用抽象类,python推荐使用鸭子类型。

  • 相关阅读:
    Metaclass
    Pydantic
    Alembic
    SQLAlchemy
    django2:路由path语法
    Django 学习笔记之模型高级用法
    Flask拾遗总汇1
    Flask中before_request与after_request使用
    Flask 中字典数据返回(jsonify)
    浅析django的abstract,proxy, managed
  • 原文地址:https://www.cnblogs.com/luck-L/p/9233609.html
Copyright © 2020-2023  润新知