Justin-刘清政的博客

python/面向对象进阶/3-类的组合

2020-12-21

一、什么是组合

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

二、为什么用组合

  • 组合是用来解决类与类之间代码冗余的问题
  • 首先我们先写一个简单版的选课系统
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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('lqz', 18, 'male', 10)
1
stu1.choose_course()
1
tank is choosing course
1
tea1.score(stu1, 100)
1
老师[lqz]为学生[tank]打分[100]
1
print(stu1.__dict__)
1
{'name': 'tank', 'age': 19, 'sex': 'male', 'stu_id': 1, 'score': 100}
  • 如上设计了一个选课系统,但是这个选课系统在未来一定是要修改、扩展的,因此我们需要修改上述的代码

三、如何用组合

  • 需求:假如我们需要给学生增添课程属性,但是又不是所有的老男孩学生一进学校就有课程属性,课程属性是学生来老男孩后选出来的,也就是说课程需要后期学生们添加进去的
  • 实现思路:如果我们直接在学生中添加课程属性,那么学生刚被定义就需要添加课程属性,这就不符合我们的要求,因此我们可以使用组合能让学生未来添加课程属性

91-类的组合-需求.jpg

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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))
1
2
3
# 创造课程
python = Course('python全栈开发', '5mons', 3000)
python.tell_info()
1
2
3
课程名:python全栈开发
课程周期:5mons
课程价钱:3000
1
2
linux = Course('linux运维', '5mons', 800)
linux.tell_info()
1
2
3
课程名:linux运维
课程周期:5mons
课程价钱:800
1
2
3
# 创造学生与老师
stu1 = OldboyStudent('tank', 19, 'male', 1)
tea1 = OldboyTeacher('lqz', 18, 'male', 10)
  • 组合
1
2
3
# 将学生、老师与课程对象关联/组合
stu1.course = python
tea1.course = linux
1
stu1.course.tell_info()
1
2
3
课程名:python全栈开发
课程周期:5mons
课程价钱:3000
1
tea1.course.tell_info()
1
2
3
课程名:linux运维
课程周期:5mons
课程价钱:800
  • 组合可以理解成多个人去造一个机器人,有的人造头、有的人造脚、有的人造手、有的人造躯干,大家都完工后,造躯干的人把头、脚、手拼接到自己的躯干上,因此一个机器人便造出来了
使用支付宝打赏
使用微信打赏

点击上方按钮,请我喝杯咖啡!

扫描二维码,分享此文章