随笔 - 139  文章 - 0 评论 - 0 阅读 - 33825
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

一、面向对象的组合用法

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

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

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

例子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   longfei2021  阅读(122)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
点击右上角即可分享
微信分享提示