类与类之间的关系

1、依赖关系(主从之分):将一个类的类名或者对象传入另一个类的方法中

class Elephant:
    def __init__(self, name):
        self.name = name

    def open(self, obj):
        print(f"{self.name}默念三声:3 2 1 开门!")
        obj.be_open()
    
    def close(self):
        print(f"{self.name}默念三声:3 2 1 关门!")


class Refrigerator:
    def __init__(self, name):
        self.name = name

    def be_open(self):
        print(f"{self.name}冰箱被打开了")
    
    def be_close(self):
        print(f"{self.name}冰箱被关闭了")


# 将一个类的类名或者对象传入另一个类的方法中

qiqi = Elephant("奇奇")
haier = Refrigerator("海尔")
qiqi.open(haier)

2、组合关系:将一个类的对象封装到另一个类的对象属性中

class Boy:
    def __init__(self, name, girlfriend=None):
        self.name = name
        self.girlfriend = girlfriend

    def have_a_diner(self):
        if self.girlfriend:
            print(f"{self.name}请他的女朋友{self.girlfriend}一起烛光晚餐")
        else:
            print("自己吃!")

yulin = Boy("yulin")
yulin.have_a_diner()

# 只是给对象封装了一个属性girlfriend为一个字符串的数据

yulin = Boy("yulin")
yulin.girlfriend = "50"
yulin.have_a_diner()

将一个类的对象封装到另一个类的对象属性中

class Boy:
    def __init__(self, name, girlfriend=None):
        self.name = name
        self.girlfriend = girlfriend

    def have_a_diner(self):
        if self.girlfriend:
            print(f"{self.name}请他的{self.girlfriend.age}岁的,身材很{self.girlfriend.body}的女朋友{self.girlfriend.name}一起烛光晚餐")
        else:
            print("自己吃!")
    
    def girl_skill(self):
        print(f"{self.name}的女朋友的技能是:")
        self.girlfriend.skill()


class Girl:
    def __init__(self, name, age, body):
        self.name = name
        self.age = age
        self.body = body

    def skill(self):
        print(f"{self.name}会唱歌")


yulin = Boy("yulin")
cola = Girl("Cola", 23, "正")
yulin.girlfriend = cola
yulin.have_a_diner()
yulin.girl_skill()
class GameRole:
    def __init__(self, name, ad, hp):
        self.name = name
        self.ad = ad
        self.hp = hp

    def attack(self, p1):
        p1.hp = p1.hp - self.ad
        print(f"{self.name}攻击了{p1.name},{p1.name}掉了{self.ad}血,还剩{p1.hp}血")


class Weapon:
    def __init__(self, name, ad):
        self.name = name
        self.ad = ad

    def weapon_attack(self, p1, p2):  # 依赖关系
        p2.hp = p2.hp - self.ad
        print(f"{p1.name}利用{self.name}给了{p2.name}一下,{p2.name}掉了{self.ad}血,还剩{p2.hp}血")


gailun = GameRole("盖伦", 10, 00)
xin = GameRole("信", 20, 80)
Sword = Weapon("大宝剑", 15)
Musket = Weapon("长缨枪", 30)

# 盖伦利用大宝剑给赵信一下

Sword.weapon_attack(gailun, xin)

1、功能虽然实现了,但是逻辑上不合理,应该是人物对象调用方法,主体
2、游戏人物本身就应该绑定武器属性

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

    def attack(self, p1):
        p1.hp = p1.hp - self.ad
        print(f"{self.name}攻击了{p1.name},{p1.name}掉了{self.ad}血,还剩{p1.hp}血")
    
    def equipment_wea(self, wea):
        self.weapon = wea  # 组合关系


class Weapon:
    def __init__(self, name, ad):
        self.name = name
        self.ad = ad

    def weapon_attack(self, p1, p2):  # 依赖关系
        p2.hp = p2.hp - self.ad
        print(f"{p1.name}利用{self.name}给了{p2.name}一下,{p2.name}掉了{self.ad}血,还剩{p2.hp}血")


gailun = GameRole("盖伦", 10, 00)
xin = GameRole("信", 20, 80)
Sword = Weapon("大宝剑", 15)
Musket = Weapon("长缨枪", 30)

# 给游戏人物封装武器属性

gailun.equipment_wea(Sword)
gailun.weapon.weapon_attack(gailun, xin)
posted @ 2020-11-13 15:35  Ylinn  阅读(282)  评论(0)    收藏  举报