Python全栈开发实战学习15

组合

组合与重用性

软件重用的重要方式除了继承之外还有另外一种方式,即组合
组合是指在一个类中以另外一个类的对象作为数据属性,称为类的组合

class Equip:# 武器装备类
    def fire(self):
        print('release Fire skill')

class Riven:# 英雄Riven的类,一个英雄需要有装备,因而需要组合Equdeip类
    camp = 'Noxus'
    def __init__(self,nickname):
        self.nickname = nickname
        self.equip = Equip() # 用Equip类产生一个装备,赋值给实例的equip属性
r1 = Riven('瑞文')
r1.equip.fire()      # release Fire skill

组合和继承都有效利用了已有类的资源的重要方式。但是二者的概念和使用场景皆不同。
1.继承的方式:通过继承建立了派生类和基类的关系,它是一种“是”的关系,比如白马是马,认识动物。当类之间有很多相同的功能,提取这些共同的功能作为基类,用继承比较好,比如老师是人,学生是人。
2.组合的方式:用组合的方式建立了类与组合的类之间的关系,它是一种“有”的关系,比如教授有生日,教授教python和linux课程,教授有学生s1,s2,s3……
示例:继承和组合

class People:
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex

class Course:
    def __init__(self,name,period,price):
        self.name = name
        self.period = period
        self.price =price
    def tell_info(self):
        print('<%s %s %s>'%(self.name,self.period,self.price))

class Teacher(People):
    def __init__(self,name,age,sex,job_title):
        People.__init__(self,name,age,sex)
        self.job_title = job_title
        self.course = []
        self.students = []
class Student(People):
    def __init__(self,name,age,sex):
        People.__init__(self,name,age,sex)
        self.course = []

egon = Teacher('egon',18,'male','金牌讲师')
s1 = Student('卡萨丁',15,'male')

python = Course('python','3mons',3000.0)
linux = Course('linux','3mons',3000.0)

#为老师egon和学生s1添加课程
egon.course.append(python)
egon.course.append(linux)
s1.course.append(python)

# 为老师egon添加学生s1
egon.students.append(s1)

# 使用
for obj in egon.course:
    obj.tell_info()

==============================
结果
<python 3mons 3000.0>
<linux 3mons 3000.0>

总结:当类之间有显著不同,并且较小的类是较大的类所需要的组件时,用组合比较好

练习

class Teacher:
    def __init__(self,name,sex,age,birthday):
        self.name = name
        self.sex = sex
        self.age = age
        self.birthday = birthday
class Birthday:
    def __init__(self,year,month,day):
        self.year = year
        self.month = month
        self.day = day

b = Birthday(2019,3,2)
ess = Teacher('ess','女',18,b)
print(ess.name)      # ess
print(ess.birthday.year)   # 2019

你可能感兴趣的:(Python)