一、简介
''' 什么是组合 组合指的是一个对象拥有某一个属性,该属性的值是另一个类的对象 为何要用组合 为了减少代码冗余 '''
二、利用组合减少代码冗余
# 背景 class Company: def __init__(self, c_name, address): self.name = c_name self.address = address class Department: def __init__(self, d_name, project): self.name = d_name self.project = project class Staff(Company, Department): def __init__(self, username, age, sex, c_name, address, d_name, project): self.name = username self.age = age self.sex = sex Company.__init__(self, c_name, address) Department.__init__(self, d_name, project) # userinfo = Staff('fred', '26', 'male', 'haymaker', 'shanghai', 'sa', 'The Walker') # 以上代码是子类通过指明道姓的方式,调用了父类的__init__()方法,但显然代码还是不够简洁 # 利用组合改进 class Company: def __init__(self, name, address): self.name = name self.address = address class Department: def __init__(self, name, project): self.name = name self.project = project class Staff(Company, Department): def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex # 创建公司信息 haymaker = Company('haymaker', 'shanghai') # 创建部门信息 sa = Department('sa', 'The Walker') # 创建员工信息 userinfo = Staff('fred', '26', 'male')
# 将部门和公司信息绑定给员工,生成员工信息 userinfo.company = haymaker userinfo.department = sa print(''' <姓名:%s 年龄:%s 性别:%s 公司:%s 公司地址:%s 部门:%s 负责产品:%s> ''' % (userinfo.name, userinfo.age, userinfo.sex, userinfo.company.name, userinfo.company.address, userinfo.department.name, userinfo.department.project)) print(userinfo.company.__dict__) print(userinfo.department.__dict__) # 利用面向对象的组合特性,上面的背景下,只要实例化出公司和部门,所有员工都可以绑定改对象,作为自己属性的值