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推荐使用鸭子类型。

猜你喜欢

转载自www.cnblogs.com/luck-L/p/9233609.html