• python---面对对象的组合


    组合

      给一个类的对象封装一个属性,这个属性是另一个类的对象,这样我们在调用这个属性时就指向了另一个类的对象,这样我们就可以调用另一个类的方法。

    模拟英雄联盟写一个游戏人物的类
    # 要求:
    # (1)创建一个 Game_role的类.
    # (2) 构造方法中给对象封装name,ad(攻击力),hp(血量).三个属性.
    # (3) 创建一个attack方法,此方法是实例化两个对象,互相攻击的功能:
    # 例: 实例化一个对象 盖伦,ad为10, hp为100
    # 实例化另个一个对象 剑豪 ad为20, hp为80
    # 盖伦通过attack方法攻击剑豪,此方法要完成 '谁攻击谁,谁掉了多少血, 还剩多少血'的提示功能.

    class LolRole:
    
        def __init__(self, name, ad, hp):  # 初始化对象属性
            self.name = name
            self.ad = ad
            self.hp = hp
    
        def attack(self, enemy):  # 攻击方法,除了攻击者本身还要有敌人(enemy)对象作为参数传入
            enemy.hp = enemy.hp - self.ad
            print('{0}攻击了{1},{1}还剩{2}血'.format(self.name, enemy.name, enemy.hp))
    
    
    gailun = LolRole('盖伦', 10, 100)  # 实例化盖伦对象,包括名字,攻击力,血量三个属性
    
    yasuo = LolRole('亚索', 20, 80)  # 实例化亚索对象
    
    gailun.attack(yasuo)  # 盖伦攻击亚索
    
    # 运行结果:盖伦攻击了亚索,亚索还剩70血

    现在我有一个weapen武器的类,需要给亚索和盖伦装备上,用武器攻击对方掉的血量则是武器的攻击力

    class LolRole:
    
        def __init__(self, name, ad, hp):  # 初始化对象属性
            self.name = name
            self.ad = ad
            self.hp = hp
    
        def attack(self, enemy):  # 攻击方法,除了攻击者本身还要有敌人(enemy)对象作为参数传入
            enemy.hp = enemy.hp - self.ad
            print('{0}攻击了{1},{1}还剩{2}血'.format(self.name, enemy.name, enemy.hp))
    
    
    gailun = LolRole('盖伦', 10, 100)  # 实例化盖伦对象,包括名字,攻击力,血量三个属性
    
    yasuo = LolRole('亚索', 20, 80)  # 实例化亚索对象
    
    gailun.attack(yasuo)  # 盖伦攻击亚索
    
    
    # 运行结果:盖伦攻击了亚索,亚索还剩70血
    
    class Weapen:
        def __init__(self, name, ad):  # 实例化武器
            self.name = name
            self.ad = ad
    
        def weapen_attack(self, role, enmey):  # 拿着武器攻击
            enmey.hp = enmey.hp - self.ad
            print('{0}拿着{1}攻击了{2},{2}掉了{3}血,还剩{4}血'
                  .format(role.name, self.name, enmey.name, self.ad, enmey.hp))
    
    
    sword = Weapen('大保剑', 30)  # 实例化武器
    katana = Weapen('草雉剑', 50)
    
    sword.weapen_attack(gailun, yasuo)

    上面定了weapen类,但是你会发现我们用武器攻击人时,行动的主体是武器而不是人,人的类是调用不了武器的方法,那么我们要如何实现是人拿着武器去攻击呢,这就用到组合的概念,我们可以将weapen实例出的对象作为属性添加到我人类中,这样我人的类在调用这个属性时,就对应了weapen的对象,而武器的对象可以调用武器类的方法,这样我们就间接的让人类的对象使用了武器类的方法。

    实现代码如下:

    class LolRole:
    
        def __init__(self, name, ad, hp):  # 初始化对象属性
            self.name = name
            self.ad = ad
            self.hp = hp
    
        def attack(self, enemy):  # 攻击方法,除了攻击者本身还要有敌人(enemy)对象作为参数传入
            enemy.hp = enemy.hp - self.ad
            print('{0}攻击了{1},{1}还剩{2}血'.format(self.name, enemy.name, enemy.hp))
    
        def equipment_weapen(self, w):  # w接受实例化的武器,这样相当于在人实例化的对象中添加了weapen这个属性这个属性对应武器的对象
            self.weapen = w
    
    
    class Weapen:
        def __init__(self, name, ad):  # 实例化武器
            self.name = name
            self.ad = ad
    
        def weapen_attack(self, role, enmey):  # 拿着武器攻击
            enmey.hp = enmey.hp - self.ad
            print('{0}拿着{1}攻击了{2},{2}掉了{3}血,还剩{4}血'
                  .format(role.name, self.name, enmey.name, self.ad, enmey.hp))
    
    
    sword = Weapen('大保剑', 30)  # 实例化武器
    katana = Weapen('草雉剑', 50)
    gailun
    = LolRole('盖伦', 10, 100) # 实例化盖伦对象,包括名字,攻击力,血量三个属性 yasuo = LolRole('亚索', 20, 80) # 实例化亚索对象

    print(gailun.__dict__) # {'name': '盖伦', 'ad': 10, 'hp': 100}

    # 将大保健交给盖伦 gailun.equipment_weapen(sword)
    print(gailun.__dict__) # {'name': '盖伦', 'ad': 10, 'hp': 100, 'weapen': <__main__.Weapen object at 0x05934450>} # 可以看见此时的gailun这个对象已经添加了这个weapen这个属性,这个属性就是实例化的武器的对象大宝剑 # 这样我们调用 gailun.weapen就等于sword。

    gailun.weapen.weapen_attack(gailun, yasuo) # 等价于sword.weapen_attack(gailun,yasuo) # 盖伦拿着大保剑攻击了亚索,亚索掉了30血,还剩50血
  • 相关阅读:
    配置 Linux 服务器 SSH 安全访问的四个小技巧
    线性代数
    转载的其它人博客
    c#下dll引入错误的问题
    游戏中简单代码
    明年的任务
    c# 异步通信网络中存在的问题
    解决导入五万条数据缓慢问题
    c#中关于结构体和字节数组转化
    写给现在的自己
  • 原文地址:https://www.cnblogs.com/Kingfan1993/p/9530912.html
Copyright © 2020-2023  润新知