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