zoukankan      html  css  js  c++  java
  • 继承外另一种重用方式——组合

    一、组合概念

      软件重用的重要方式除了继承之外还有另外一种方式——组合

    1、组合定义

      组合指的是,在一个类中以另外一个类的对象(也就是实例)作为数据属性,称为类的组合。

      也就是说,一个类的属性是另一个类的对象,就是组合。

    >>> class Equip: #武器装备类
    ...     def fire(self):
    ...         print('release Fire skill')
    ... 
    >>> class Riven: #英雄Riven的类,一个英雄需要有装备,因而需要组合Equip类
    ...     camp='Noxus'
    ...     def __init__(self,nickname):
    ...         self.nickname=nickname
    ...         self.equip=Equip() #用Equip类产生一个装备,赋值给实例的equip属性
    ... 
    >>> r1=Riven('锐雯雯')
    >>> r1.equip.fire() #可以使用组合的类产生的对象所持有的方法
    release Fire skill

    二、继承和组合对比

    共性

      组合和继承都是有效利用已有类资源的重要方式(代码重用)。

    差异

      继承:建立派生类和基类间的关系,是一种“是”的关系。

      组合:建立类与组合的类之间的关系,是一种“有”的关系。

    适用情况

      继承:当类之间有很多相同的功能,提取这些共同的功能做成基类,用继承比较好  

      组合:当类之间有显著不同,并且较小的类是较大的类所需要的组件时,用组合比较好。

    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()
  • 相关阅读:
    html
    jQuery
    Python基础(一)
    excel中怎样批量取消隐藏工作表
    AD密码过期查询
    @Controller和@RestController的区别
    编写一个JPA测试用例
    SpringBoot(二)——使用Mysql和JPA
    Linux命令大全
    Centos7安装Mysql
  • 原文地址:https://www.cnblogs.com/xiugeng/p/8920018.html
Copyright © 2011-2022 走看看