• 第二十九篇 类的组合


    组合

    定义一个人的类,人有头,躯干,手,脚等数据属性,这几个属性又可以是通过一个类实例化的对象,这就是组合。

    用途:

    1. 做关联(类跟类之间没有共同点,但是类与类之间是有联系的,所以,就可以通过组合的方式进行类与类的关联)

    2. 小的组成大的

    class Head:
        pass
    
    class Trunk:
        pass
    
    class Hand:
        pass
    
    class Foot:
        pass
    
    # 什么是组合?
    # 首先,上面定义了头 躯干 手 脚 四个类
    # 其次,定义一个人类Person, 这Person大类是由一个个小类拼接到一起组合而成的这就是组合
    class Person:
        def __init__(self,id_num,name):
            self.id_num=id_num
            self.name=name
            self.hand=Hand()
            self.foot=Foot()
            self.trunk=Trunk()
            self.head=Head()
    
    # 实例化
    p1=Person('62282119xxxxxxxxx','alex')
    组合的结构
    class School:
        def __init__(self,name,addr):
            self.name=name
            self.addr=addr
    
        def zhao_sheng(self):
            print('%s 正在招生' %self.name)
    
    class Course:
        def __init__(self,name,price,period,school):
            self.name=name
            self.price=price
            self.period=period
            self.school=school
    
    # 实例化
    s1=School('农大','北京海淀')
    s2=School('农大','南京')
    s3=School('农大','东京')
    
    c1=Course('linux',10,'1h',s1)
    
    print(c1.__dict__)       # 查看c1有哪些字典属性
    print(c1.school.name)  # 查看c1是哪个学校开设的
    print(s1)
    组合示例

    这就是一个组合的示例,但你会发现,是实例完之后,才会传进来一个学校,不够智能。

    有个新的需求:做个选课系统,就是新建一门课程,就要能能学校关联起来。

    c1=Course('linux',10,'1h',s1)
    # 上面的示例,没有自动关联是因为,实例化的时候,学校s1是被写死的,
    # 只需要把它写活就可以了。
    上面都是示例为啥不能自动关联

    那就写活它,让它自动关联起来吧,目前学的是可以通过input的方式实现

    class School:
        def __init__(self,name,addr):
            self.name=name
            self.addr=addr
    
    
        def zhao_sheng(self):
            print('%s 正在招生' %self.name)
    
    class Course:
        def __init__(self,name,price,period,school):
            self.name=name
            self.price=price
            self.period=period
            self.school=school
    
    
    
    s1=School('农大','北京')
    s2=School('农大','南京')
    s3=School('农大','东京')
    
    msg='''
    1 农大 北京校区
    2 农大 南京校区
    3 农大 东京校区
    '''
    while True:
        print(msg)
        xiao_qu={
            '1':s1,
            '2':s2,
            '3':s3
        }
    
        # 课程信息
        name=input('课程名>>: ')
        price=input('课程费用>>: ')
        period=input('课程周期>>: ')
    
        choice=input('选择学校>>: ')
        school_obj=xiao_qu[choice]  # 学校名
    
        # 实例化
        new_course=Course(name,price,period,school_obj)
        print('课程【%s】属于【%s】%s校区,价格是%s,周期是%s' 
              %(new_course.name, new_course.school.name,new_course.school.addr, new_course.price, new_course.period))
    新建课程就能与学校关联起来
    class School:
        def __init__(self,name,addr):
            self.name=name
            self.addr=addr
            self.course_list=[]
    
        def zhao_sheng(self):
            print('%s 正在招生' %self.name)
    
    class Course:
        def __init__(self,name,price,period):
            self.name=name
            self.price=price
            self.period=period
    
    s1=School('农大','北京')
    s2=School('农大','南京')
    s3=School('农大','东京')
    
    c1=Course('linux',10,'1h')
    c2=Course('python',10,'1h')
    
    # 通过append的方式进行课程与学校的关联
    s1.course_list.append(c1)
    s1.course_list.append(c2)
    print(s1.__dict__)
    
    # 取出课程的名字
    for course_obj in s1.course_list:
        print(course_obj.name,course_obj.price,course_obj.period)
    不用组合,但是实现方式很low啦,最好别用哦
  • 相关阅读:
    MongoDB的安装和常用命令
    mysql安装、使用与遇见的问题汇总
    devicePixelRatio,Viewport,移动端适配
    javascript 数组以及对象的深拷贝(复制数组或复制对象)的方法
    正则表达式
    npm 常用命令
    Markdown 基本语法
    mysql忘记root密码
    mysql5.7.12/13在安装新实例时报错:InnoDB: auto-extending data file ./ibdata1 is of a different size 640 pages (rounded down to MB) than specified in the .cnf file: initial 768 pages, max 0 (relevant if non-zero
    mysqld数据位于a盘,执行delete from table, 发现另外2个盘磁盘使用率接近100%,而a盘的使用率反而很低,y??
  • 原文地址:https://www.cnblogs.com/victorm/p/9314539.html
Copyright © 2020-2023  润新知