python面向对象之类的组合

一、python类的组合:给一个类的对象封装一个属性,这个属性是另一个类的对象
二、组合的意义:让类的对象与另一个类的对象产生关系,类与类之间产生关系。
三、例子
模拟英雄联盟写一个游戏人物的类
要求:
(1)创建一个 Game_role的类.
(2)构造方法中给对象封装 name,ad(攻击力),hp(血量).三个属性.
(3)再创建一个武器类Weapen,构造方法中给对象封装 武器名、武器攻击力两个属性
(4)武器类还有一个攻击方法用来完成攻击的功能。
整体实现的是:
  实例化一个对象 盖伦,ad为69, hp为500
  实例化另个一个对象 亚索 ad为76, hp为400
  实例化盖伦的武器: 大宝剑,武器攻击力40
  实例化 亚索的武器:武士刀,武器攻击力60
  盖伦通过attack方法攻击剑豪,此方法要完成 '谁用什么武器攻击了谁,谁掉了多少血, 还剩多少血'的提示功能.

 

复制代码
class Game_role:

    def __init__(self,name,ad,hp):
        self.name = name
        self.ad = ad
        self.hp = hp

    def use_weapen(self,w):
        self.weapen = w


class Weapen:

    def __init__(self,weapen_name,weapen_ad):
        self.weapen_name = weapen_name
        self.weapen_ad = weapen_ad

    def attack(self,role1,role2):
        role2.hp = role2.hp - role1.ad - self.weapen_ad
        msg = '{}用{}攻击了{},{}掉了{}血,还剩{}血'.\
             format(role1.name,self.weapen_name,role2.name,role2.name,(role1.ad + self.weapen_ad),role2.hp)
        print(msg)

# 实例化两个人物对象
p1 = Game_role('盖伦',69,500)
p2 = Game_role('亚索',76,400)

#实例化两把武器
w1 = Weapen('大宝剑',50)
w2 = Weapen('孤儿剑',60)

# 这样直接调用Weapen的方法虽然可以实现,但是这样实现的话,主体谁攻击谁不能一目了然
w1.attack(p1,p2)        #盖伦用大宝剑攻击了亚索,亚索掉了119血,还剩281血


# 所以,这时候就需要用到类的组合,在人物对象中设置一个属性,把武器类的对象传进去,
# 再使用这个属性调用攻击方法,就可以知道谁发起的攻击,一目了然
# 所以此时要在人物类中设置一个方法(use_weapen),用于给人物对象设置武器的属性
# 这样就可以一目了然知道谁是攻击的主体

p1.use_weapen(w1)            #把w1这个对象赋给p1的一个属性(weapen) 相当于 p1.weapen = w1
p1.weapen.attack(p1,p2)    # 通过p1.weapen调用attack方法 相当于 w1.attcak(p1,p2)

# 这样就可以一目了然知道p1是攻击的主体
复制代码

 

posted @   我用python写Bug  阅读(409)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示