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

    一、什么是组合

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

    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

  • 相关阅读:
    codeforces 616B Dinner with Emma
    codeforces 616A Comparing Two Long Integers
    codeforces 615C Running Track
    codeforces 612C Replace To Make Regular Bracket Sequence
    codeforces 612B HDD is Outdated Technology
    重写父类中的成员属性
    子类继承父类
    访问修饰符
    方法的参数
    实例化类
  • 原文地址:https://www.cnblogs.com/nickchen121/p/10988446.html
Copyright © 2011-2022 走看看