一、组合
1.定义:
组合就是一个类的对象具备了某一个属性,该属性的值是指向另一个类的对象
2.为何需要用组合
组合的存在是为了解决类与类之间代码的冗余的问题
3.如何用组合
1 class Course: # 可以将所有的学生定义成一个学生类 2 def __init__(self,name,period,price): 3 self.name=name 4 self.period=period 5 self.price=price 6 def info(self): 7 msg=''' 8 课程名:%s 9 价格:%s 10 周期:%s 11 '''%(self.name,self.period,self.price) 12 print(msg) 13 14 class School: 15 def __init__(self,name): 16 self.name=name 17 18 class Teacher(School): # 可以将所有的学生定义成一个学生类 19 def __init__(self,name,salary): 20 self.name=name 21 super(Teacher, self).__init__(salary) 22 self.salary=salary 23 def tell(self): 24 print(''' 25 26 ''') 27 28 class Student(School): # 可以将所有的学生定义成一个学生类 29 def __init__(self,name,stu_id,): 30 super(Student, self).__init__(name) 31 self.stu_id=stu_id 32 33 34 # 实例化(也可称为对象) 35 sch=School('Shanghai') 36 tea=Teacher('Dabao',12306) 37 stu=Student('Xiaoming',10000) 38 cos=Course('linux',6,10086) 39 40 41 # 将学生、老师与课程对象相关联 42 # 这样学生和老师就都可以取出和 43 # 自己不相关联的类里边的属性了 44 45 stu.corse=cos 46 tea.course=cos 47 48 # 学生、老师取出另外一个类中的属性 49 stu.corse.info() 50 tea.course.info()
二、菱形继承
1.定义
当一个子进程继承了多个父类的时候,多个父类最终继承了同一个类,这种继承称之为菱形继承。
2.菱形继承的问题
在python2 和python3中,关于继承问题下的属性查找问题:
python2:分成新式类与经典类,只有继承了object类的类才是新式类,没有继承object的类是经典类。
新式类是按照广度优先的顺序查找属性的;经典类是按照深度优先查找属性的
python3:只有新式类,如果没有写着继承object类则默认继承object类,是按照广度优先查找属性的。
3.派生
3.1 在子派生的新方法中重用父类的两种方式
1 # 直接用类名、函数名 2 3 class parent(): 4 def __init__(self,name,age): 5 self.name=name 6 self.age=age 7 8 class Children(parent): 9 def __init__(self,name,age,sex): 10 parent.__init__(name,age) 11 self.sex=sex
class Parent(): def __init__(self,name,age): self.naem=name self.age=age class Children(Parent): def __init__(self,name,age,sex): super(Children, self).__init__(name,age) self.sex=sex
super()会得到一个特殊的对象,该对象就是专门严格按照继承的关系访问父类中的属性 super()可以不用为self传值 注意点: super()的完整用法是super(自己的类名,self).__init__(属性1,属性2) 在python2中需要写完整用法,但是在python3中可以不必写出完整用法
三、多态
1.定义
多态指的是同一种事物的多种状态。
2.为何要用多态
多态性:继承同一个类的多个子类中有相同的方法名
这时,子类产生的对象就可以不用考虑具体的类型而直接调用该功能
3.用法
1 import abc 2 3 class Animal(mataclass=abc.ABCMeta): 4 # 父类不能被实例化,它是用来指定标准的 5 6 @abc.abstractclassmethod 7 def speak(self): 8 pass 9 10 @abc.abstractclassmethod 11 def eat(self): 12 pass 13 14 class People(Animal): 15 def speak(self): 16 print("hi") 17 def eat(self): 18 pass 19 20 class Dog(Animal): 21 def speak(self): 22 print("hehe") 23 def eat(self): 24 pass 25 26 p1=People() 27 d1=Dog() 28 29 p1.speak() 30 d1.speak()