一、面向对象的组合用法
软件重用的重要方式除了继承之外还有另外一种方式,即:组合
组合指的是,在一个类中以另外一个类的对象作为数据属性,称为类的组合
用组合的方式建立了类与组合的类之间的关系,它是一种‘有’的关系
作用:让类的对象与另一个类的对象发生关联,从而可以互相访问
例子1:
class Game_Role: def __init__(self, name, ad, hp): self.name = name self.ad = ad self.hp = hp def fight(self, role1): role1.hp -= self.ad print('%s攻击%s,%s血量还剩%s' % (self.name, role1.name, role1.name, role1.hp)) def weapon(self, wea): # 武器类的对象封装到人的对象中当做一个属性,就叫做组合. self.wea = wea class Weapon: def __init__(self, name, ad): self.name = name self.ad = ad def attack(self, role1, role2): role2.hp = role2.hp - self.ad - role1.ad print('%s利用%s攻击%s,%s血量还剩%s' % (role1.name, self.name, role2.name, role2.name, role2.hp)) p1 = Game_Role('盖伦', 50, 500) p2 = Game_Role('狗头', 80, 250) sword = Weapon('大宝剑', 40) p1.weapon(sword) p1.wea.attack(p1, p2) #盖伦利用大宝剑攻击狗头,狗头血量还剩160
例子2:
圆环是由两个圆组成的,圆环的面积是外面圆的面积减去内部圆的面积。圆环的周长是内部圆的周长加上外部圆的周长。
这个时候,我们就首先实现一个圆形类,计算一个圆的周长和面积。然后在"环形类"中组合圆形的实例作为自己的属性来用
from math import pi class Circle: ''' 定义了一个圆形类; 提供计算面积(area)和周长(perimeter)的方法 ''' def __init__(self,radius): self.radius = radius def area(self): return pi * self.radius * self.radius def perimeter(self): return 2 * pi *self.radius circle = Circle(10) #实例化一个圆 area1 = circle.area() #计算圆面积 per1 = circle.perimeter() #计算圆周长 print(area1,per1) #打印圆面积和周长 class Ring: ''' 定义了一个圆环类 提供圆环的面积和周长的方法 ''' def __init__(self,radius_outside,radius_inside): self.outsid_circle = Circle(radius_outside) self.inside_circle = Circle(radius_inside) def area(self): return self.outsid_circle.area() - self.inside_circle.area() def perimeter(self): return self.outsid_circle.perimeter() + self.inside_circle.perimeter() ring = Ring(10,5) #实例化一个环形 print(ring.perimeter()) #计算环形的周长 print(ring.area()) #计算环形的面积
例子3:
定义生日类,课程类和人类,人可以与生日类和课程类组合,将生日类和课程类作为人类的参数
class Birthday: def __init__(self, year, month, day): self.year = year self.month = month self.day = day class Course: def __init__(self, name, period): self.name = name self.period = period class Person: def __init__(self, name,birth, course): self.name = name self.birth = birth self.course = course p1 = Person('Tom', Birthday(2000,5,10), Course('Python', '4 month')) print(p1.name) print(p1.birth.year, p1.birth.month, p1.birth.day) print(p1.course.name, p1.course.period) 结果: Tom 2000 5 10 Python 4 month
或者Birthday类和Course类不变,修改Person类的代码如下:
class Person: def __init__(self, name): self.name = name def my_birth(self,birth): self.my_birth = birth def my_course(self,course): self.my_course = course bir1 = Birthday(2001,6,11) course1 = Course('Java','5 month') p1 = Person('Mike') p1.my_birth(bir1) p1.my_course(course1) print(p1.name, p1.my_birth.year, p1.my_birth.month, p1.my_birth.day) print(p1.my_course.name, p1.my_course.period) 结果: Mike 2001 6 11 Java 5 month