zoukankan      html  css  js  c++  java
  • 125 类的组合

    一、什么是组合

    • 组合就是一个类的对象具备某一个属性,该属性的值是指向另外外一个类的对象

    91-类的组合-tfboys.jpg?x-oss-process=style/watermark

    二、为什么用组合

    • 组合是用来解决类与类之间代码冗余的问题

    • 首先我们先写一个简单版的选课系统

    class OldboyPeople:
        school = 'oldboy'
    
        def __init__(self, name, age, sex):
            self.name = name
            self.age = age
            self.sex = sex
    
    
    class OldboyStudent(OldboyPeople):
        def __init__(self, name, age, sex, stu_id):
            OldboyPeople.__init__(self, name, age, sex)
            self.stu_id = stu_id
    
        def choose_course(self):
            print('%s is choosing course' % self.name)
    
    
    class OldboyTeacher(OldboyPeople):
        def __init__(self, name, age, sex, level):
            OldboyPeople.__init__(self, name, age, sex)
            self.level = level
    
        def score(self, stu, num):
            stu.score = num
            print('老师[%s]为学生[%s]打分[%s]' % (self.name, stu.name, num))
    
    
    stu1 = OldboyStudent('tank', 19, 'male', 1)
    tea1 = OldboyTeacher('nick', 18, 'male', 10)
    
    stu1.choose_course()
    
    tank is choosing course
    
    tea1.score(stu1, 100)
    
    老师[nick]为学生[tank]打分[100]
    
    print(stu1.__dict__)
    
    {'name': 'tank', 'age': 19, 'sex': 'male', 'stu_id': 1, 'score': 100}
    
    • 如上设计了一个选课系统,但是这个选课系统在未来一定是要修改、扩展的,因此我们需要修改上述的代码

    三、如何用组合

    • 需求:假如我们需要给学生增添课程属性,但是又不是所有的老男孩学生一进学校就有课程属性,课程属性是学生来老男孩后选出来的,也就是说课程需要后期学生们添加进去的

    • 实现思路:如果我们直接在学生中添加课程属性,那么学生刚被定义就需要添加课程属性,这就不符合我们的要求,因此我们可以使用组合能让学生未来添加课程属性

    91-类的组合-需求.jpg?x-oss-process=style/watermark

    class Course:
        def __init__(self, name, period, price):
            self.name = name
            self.period = period
            self.price = price
    
        def tell_info(self):
            msg = """
            课程名:%s
            课程周期:%s
            课程价钱:%s
            """ % (self.name, self.period, self.price)
            print(msg)
    
    
    class OldboyPeople:
        school = 'oldboy'
    
        def __init__(self, name, age, sex):
            self.name = name
            self.age = age
            self.sex = sex
    
    
    class OldboyStudent(OldboyPeople):
        def __init__(self, name, age, sex, stu_id):
            OldboyPeople.__init__(self, name, age, sex)
            self.stu_id = stu_id
    
        def choose_course(self):
            print('%s is choosing course' % self.name)
    
    
    class OldboyTeacher(OldboyPeople):
        def __init__(self, name, age, sex, level):
            OldboyPeople.__init__(self, name, age, sex)
            self.level = level
    
        def score(self, stu, num):
            stu.score = num
            print('老师[%s]为学生[%s]打分[%s]' % (self.name, stu.name, num))
    
    # 创造课程
    python = Course('python全栈开发', '5mons', 3000)
    python.tell_info()
    
            课程名:python全栈开发
            课程周期:5mons
            课程价钱:3000
    
    linux = Course('linux运维', '5mons', 800)
    linux.tell_info()
    
            课程名:linux运维
            课程周期:5mons
            课程价钱:800
    
    # 创造学生与老师
    stu1 = OldboyStudent('tank', 19, 'male', 1)
    tea1 = OldboyTeacher('nick', 18, 'male', 10)
    
    • 组合
    # 将学生、老师与课程对象关联/组合
    stu1.course = python
    tea1.course = linux
    
    stu1.course.tell_info()
    
            课程名:python全栈开发
            课程周期:5mons
            课程价钱:3000
    
    tea1.course.tell_info()
    
            课程名:linux运维
            课程周期:5mons
            课程价钱:800
    
    • 组合可以理解成多个人去造一个机器人,有的人造头、有的人造脚、有的人造手、有的人造躯干,大家都完工后,造躯干的人把头、脚、手拼接到自己的躯干上,因此一个机器人便造出来了

    91-类的组合-机器人.gif

  • 相关阅读:
    3.1C#中的命名空间
    2章总结
    2.4冒泡排序
    2.3 C#中的数组
    2.2二重循环
    2.1c#中的循环语句
    1章总结
    docker内外数据拷贝
    搭建docker环境
    centos7 部署Apache的httpd服务器
  • 原文地址:https://www.cnblogs.com/abdm-989/p/11899642.html
Copyright © 2011-2022 走看看