zoukankan      html  css  js  c++  java
  • 面向对象之组合

    TOC

    一、组合介绍

    耦合度越高:程序的可扩展性越低

    耦合度越低:程序的可扩展性越高

    1、组合的定义

    组合指的是一个对象中,包含着另一个或多个对象

    2、为什么要用组合

    减少代码的冗余

    3、如何使用组合

    需求:

    为老师和学生类添加打印出生年月日功能

    利用继承实现

    # 1、为老师类和学生类加入  year, month, day
    # 2、新增打印出老师和学生的年月日的出生日期
    # 通过继承来实现
    
    
    # 父类
    from scipy.constants import year
    
    
    class People:
        def __init__(self, name, age, sex, year, month, day):
            self.name = name
            self.age = age
            self.sex = sex
            # 如果使用继承新增出生日期,需要在父类中新增(year, month, day)年月日
            self.year = year
            self.month = month
            self.day = day
    
        # 为其添加第二个功能,打印出生年月日
        def print_date(self):
            print('''
            ====== 出生日期 ======
            年:%s
            月:%s
            日:%s
            ''' % (self.year, self.month, self.day))
    
    # 老师类
    class Teacher(People):
        # 如果想通过调用父类中的init新增year, month, day,那子类中需要传入year, month, day
        def __init__(self, name, age, sex, year, month, day):
            # 以及调用父类中的super().__init__的括号中也需要传入年月日
            super().__init__(name, age, sex, year, month, day)
    
    
    # 学生类
    class Student(People):
        # 学生类中也需要像教师类中的形参,以便传入调用类时,括号里面的年月日
        def __init__(self, name, age, sex, year, month, day):
            super().__init__(name, age, sex, year, month, day)
    
    
    # 老师对象
    t1 = Teacher('张三', 27, 'male', 1984, 2, 1)
    
    # 学生对象
    stu1 = Student('李雷', 20, 'female', 1998, 3, 4)
    
    print(t1.name, t1.age, t1.sex, t1.year, t1.month, t1.day)
    # 调用父类中的打印出生日期
    t1.print_date()
    print(stu1.name, stu1.age, stu1.sex)
    stu1.print_date()
    

    利用组合实现

    # 父类
    class People:
        def __init__(self, name, age, sex):
            self.name = name
            self.age = age
            self.sex = sex
    
    
    # 教师类
    class Teacher(People):
        def __init__(self, name, age, sex):
            super().__init__(name, age, sex)
    
    
    # 学生类
    class Student(People):
        def __init__(self, name, age, sex):
            super().__init__(name, age, sex)
    
    
    # 日期类
    class Time:
        def __init__(self, year, month, day):
            self.year = year
            self.month = month
            self.day = day
    
        def print_time(self):
            print('''
            ==== 出生日期 ====
            年:%s
            月:%s
            日:%s
            ''' % (
                self.year,
                self.month,
                self.day
            ))
    
    
    t1 = Teacher('张三', 39, 'male')
    time_obj = Time(1984, 2, 4)
    # print(t1.name, t1.age, t1.sex)
    # time_obj.print_time()
    t1.time_obj = time_obj  # 此处相当于为t1对象中添加了time_obj对象的属性和方法
    t1.time_obj.print_time()

    组合练习

    """
    练习需求:
        选课系统:
            1.有学生、老师类,学生与老师有属性 “名字、年龄、性别、课程”,
            2.有方法 老师与学生可以添加课程, 打印学习/教授课程。
    
        # 组合实现
    """
    
    
    class People:
        def __init__(self, name, age, sex):
            self.name = name
            self.age = age
            self.sex = sex
    
        # 添加课程的功能
        def add_course(self, course_obj):  # self--->stu1
            # sut1.course_list = []
            self.course_list.append(course_obj)  # stu1.course_list.append()
            # sut1.course_list.append = [linux_obj, python_obj]
    
        # 打印当前对象中课程列表中的所有课程信息
        def print_all_course_info(self):  # self ---> stu1
            for course_obj in self.course_list:  # [python_obj, linux_obj]
                # 第一次循环 course_obj ---> python_obj
                # python_obj.print_course_info()
                # 相当于在调用python_obj对象中的print_course_info方法
                # 第二次循环 course_obj ---> linux_obj
                # linux_obj.print_course_info()
                # 相当于在调用linux_obj对象中的print_course_info方法
                course_obj.print_course_info()
    
    
    class Teacher(People):
        def __init__(self, name, age, sex):
            super().__init__(name, age, sex)
            self.course_list = []
    
    
    class Student(People):
        def __init__(self, name, age, sex):
            super().__init__(name, age, sex)
            self.course_list = []
    
    
    # 定义一个课程类,里面包含了课程的名字,课程的价格,课程的时间
    class ChoiceCourse:
        def __init__(self, course_name, course_price, course_time):
            self.course_name = course_name
            self.course_price = course_price
            self.course_time = course_time
    
        def print_course_info(self):
            print('''
            课程名字:%s
            课程价格:%s
            课程时长:%s
            ''' % (self.course_name,
                  self.course_price,
                  self.course_time))
    
    
    # stu1对象拥有的属性:name,年龄,性别, course_list = []  方法:add_course(继承自父类), print_all_course_info(继承自父类)
    stu1 = Student('韩梅梅', 23, 'female')
    # linux_obj对象拥有的属性:course_name, course_price, course_time    方法:print_course_info
    linux_obj = ChoiceCourse('linux', 2000, 5)
    # python_obj对象拥有的属性:course_name, course_price, course_time   方法:print_course_info
    python_obj = ChoiceCourse('python', 2000, 4)
    
    # 学生调用父类中的add_course方法添加课程
    stu1.add_course(linux_obj)
    stu1.add_course(python_obj)
    
    # 学生调用父类中的打印方法
    stu1.print_all_course_info()

    4、总结

    • 继承
      • 继承是类与类的关系,子类继承父类的属性/方法,子类与父类是一种“从属”关系
    • 组合
      • 组合是对象与对象的关系,一个对象拥有另外一个对象中的属性/方法。




  • 相关阅读:
    LeetCode124 二叉树中的最大路径和
    LeetCode100 相同的树
    LeetCode206 反转链表
    LeetCode460 LFU缓存
    LeetCode876 链表的中间结点
    hdu2767 强连通分量
    hdu1827 强连通分量
    模板 tarjan算法
    hdu2227 树状数组优化dp
    割点和桥
  • 原文地址:https://www.cnblogs.com/cnhyk/p/11944454.html
Copyright © 2011-2022 走看看