一、面向对象的组合用法

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

用组合的方式建立了类与组合的类之间的关系,它是一种‘有’的关系

作用:让类的对象与另一个类的对象发生关联,从而可以互相访问

例子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

 

posted on 2018-11-16 12:37  longfei2021  阅读(120)  评论(0编辑  收藏  举报