组合继承多态

Posted smart1san

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了组合继承多态相关的知识,希望对你有一定的参考价值。

一、组合

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中可以不必写出完整用法
super()的解释

 

三、多态

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()
简单举例

 

以上是关于组合继承多态的主要内容,如果未能解决你的问题,请参考以下文章

理解继承 组合 多态

理解继承 组合 多态

将继承重构为在 C++ 中保持多态功能的组合

组合继承多态

类的继承派生组合菱形的继承多态

Notes: Java的访问权限组合/继承和多态