1、组合的概念:
软件重用的重要方式除了继承之外还有一个重要的方式:组合。
组合指的是,在一个类中以另外一个类的对象作为数据属性,称为类的组合。
例:人打狗的例:
class Dog:
def __init__(self, name, aggr, hp, kind):
self.name = name
self.aggr = aggr
self.hp = hp
self.kind = kind
def bite(self, person):
person.hp -= self.aggr
class Person:
def __init__(self, name, aggr, hp, sex, weapon, money):
self.name = name
self.aggr = aggr
self.hp = hp
self.kind = sex
self.weapon = None
self.money = 0
def attack(self, dog):
dog.hp -= self.aggr
def get_weapon(self, weapon):
if self.money >= weapon.price:
self.money -= weapon.price
self.weapon = weapon
self.aggr += weapon.aggr
class Weapon:
def __init__(self, name, aggr, njd, price):
self.name = name
self.aggr = aggr
self.njd = njd
self.price = price
def hand18(self, person):
if self.njd >= 1:
person.hp -= self.aggr * 2 # 攻击力加2
self.njd -= 1 # 耐久度减1
alex = Person('alex', 0.5, 100, '不详', None, 0)
jin = Dog('金老板', 100, 500, 'teddy')
# 实例了一个Weapon类对象
w = Weapon('打狗棒', 100, 3, 998)
# 给alex充值1000元
alex.money += 1000
print(alex.money)
# 给alex增加装备打狗棒
alex.get_weapon(w)
print(alex.weapon.name)
print(alex.aggr)
# alex 袭击金老板
alex.attack(jin)
print(jin.hp)
# alex 使用武器的降龙18掌的属性
alex.weapon.hand18(jin)
print(jin.hp)
组合:一个对象的属性值是另外一个类的对象。
alex.weapon是Weapon类的对象。
2、创建一个圆环类,并求它的周长和面积,通过组合实现。
from math import pi
class Circle():
def __init__(self, radius):
self.radius = radius
def circumference(self):
return pi * 2 * self.radius
def area(self):
return pi * pow(self.radius, 2)
class Ring:
def __init__(self, outside_radius, inside_radius):
self.outside_c = Circle(outside_radius) # 通过外圆半径,创建一个outside_c圆对象
self.inside_c = Circle(inside_radius) # 通过内圆半径,创建一个inside_c圆对象
def perimeter(self):
return self.inside_c.circumference() + self.outside_c.circumference()
def area(self):
return self.outside_c.area() - self.inside_c.area()
# 实例化ring一个对象
ring = Ring(20, 10)
# 打印ring的面积
print(ring.area())
# 打印ring的周长
print(ring.perimeter())
这里有一个地方需要注意下:就是self不单单可以传入的参数的值,也可以依赖参数生成的新值。
这个圆环就是一个特殊的例子。
3、创建一个老师类、老师有生日、生日也是一个类。组合
class Birthday:
def __init__(self, year, month, day):
self.year = year
self.month = month
self.day = day
def get_year(self):
return self.year
def get_month(self):
return self.month
def get_day(self):
return self.day
class Course:
def __init__(self, course_name, period, price):
self.course_name = course_name
self.period = period
self.price = price
class Teacher:
def __init__(self, name, age, sex, birthday):
self.name = name
self.age = age
self.sex = sex
self.birthday = birthday
self.course = Course('Python', '6 month', 20000) # 在Teacher里面实例化了一个课程实例化course对象
birth = Birthday(1997, 12, 12)
t1 = Teacher('chang', 18, '男', birth)
print(t1.name)
# 获得老师是哪一年出生的
print(t1.birthday.get_year())
# 获得老师出生的月份
print(t1.birthday.month)
组合,可以解决我们编程80%的例子。
当类之间有显著不同,并且较小的类是较大的类所需要的组件时,用组合比较好。
课后作业:学校管理系统