第二十九篇 类的组合

组合

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

用途:

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啦,最好别用哦

 

posted @ 2018-07-15 20:25  mamingchen  阅读(199)  评论(0编辑  收藏  举报