第二十九篇 类的组合
组合
定义一个人的类,人有头,躯干,手,脚等数据属性,这几个属性又可以是通过一个类实例化的对象,这就是组合。
用途:
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)