一、简介
'''
什么是组合
组合指的是一个对象拥有某一个属性,该属性的值是另一个类的对象
为何要用组合
为了减少代码冗余
'''
二、利用组合减少代码冗余
# 背景
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__)
# 利用面向对象的组合特性,上面的背景下,只要实例化出公司和部门,所有员工都可以绑定改对象,作为自己属性的值