类之间的关系


类之间的关系

依赖关系

class Dog:
    def __init__(self,name,age,breed,master):
        self.name=name
        self.age=age
        self.breed=breed
        self.master=master #传进来是个对象
        self.sayhi()
    def sayhi(self):
        print('my name is %s,my bread is %s,my master is %s'%(self.name,self.breed,self.master.name))
class Person:
    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex
    def walk_dog(self,dog_obj):
        print("主人%s带%s出去溜溜弯。。。"%(self.name,dog_obj.name))
p1=Person('刘一骏',23,'男')
d1=Dog('哈士奇',12,'京巴',p1)
print(d1.breed)
p1.walk_dog(d1)

结果

my name is 哈士奇,my bread is 京巴,my master is 刘一骏
京巴
主人刘一骏带哈士奇出去溜溜弯。。。

关联关系(用一个新类来关联)

class RelationShip:
    """保存couple之间的对象关系"""
    def __init__(self):
        self.couple=[]
    def make_couple(self,obj1,obj2):
        self.couple=[obj1,obj2]
        print("%s和%s确定了夫妻关系。。。"%(obj1.name,obj2.name))
    def get_my_parter(self,obj):
        # print('找%s的对象'%(obj.name))
        for i in self.couple:
            if i!=obj:
                return i.name
        else:
            print("\n你没有对象")
    def break_up(self):
        print("%s和%s离婚了。。。。"%(self.couple[0].name,self.couple[1].name))
        self.couple.clear()
class Person:
    def __init__(self,name,age,sex,relation):
        self.name=name
        self.age=age
        self.sex=sex
        self.parter=None
        self.relation=relation #在每个人实例里存储关系对象
relation_obj=RelationShip()
p1=Person('刘一骏',32,'M',relation_obj)
p2=Person('陈倩君',30,'F',relation_obj)
relation_obj.make_couple(p1,p2)
print(relation_obj.get_my_parter(p1))#找p1刘一骏的对象
relation_obj.break_up()

结果

刘一骏和陈倩君确定了夫妻关系。。。
陈倩君
刘一骏和陈倩君离婚了。。。。

组合关系(一堆组件构成完整的实体)

class Person:#定义一个类
    role='person'#人的角色属性是人
    def __init__(self,name,sex):
        self.name=name
        # self.attack_val=attack_val
        self.life_val=100#实例化的时候血量为100
        self.sex=sex
        self.weapon=Weapon()#直接实例化,生成一个人就生成武器
    def attack(self,dog):
        dog.life_val -=self.attack_val
        print('%s打了狗%s,狗掉血%s,还剩余血量%s...'%(self.name,dog.name,self.attack_val,dog.life_val))
class Dog:
    role='dog'#狗的公共属性是狗
    def __init__(self,name,attack_val):
        self.name=name
        self.attack_val=attack_val#每一条狗都有自己的攻击力
        self.life_val=100
    def bite(self,person):
        person.life_val -=self.attack_val
        print("狗%s咬了人%s一口,人掉血%s,还剩血量%s"%(self.name,person.name,self.attack_val,person.life_val))
class Weapon:#要和对象组合在一起才有用
    def dog_stick(self,obj):
        """打狗棒"""
        self.name='打狗棒'
        self.attack_val=40
        obj.life_val -= self.attack_val
        self.print_log(obj)
    def knife(self,obj):
        """屠龙刀"""
        self.name='屠龙刀'
        self.attack_val=80
        obj.life_val -= self.attack_val
        self.print_log(obj)
    def dog_stick(self,obj):
        """AK"""
        self.name='AK47'
        self.attack_val=40
        obj.life_val -= self.attack_val
        self.print_log(obj)
    def print_log(self,obj):
        print("%s被%s攻击了,掉血%s,还剩血量%s..."%(obj.name,self.name,self.attack_val,obj.life_val))

p1=Person('刘一骏',60)
d1=Dog('藏獒',60)
p1.weapon.dog_stick(d1)
p1.weapon.dog_stick(d1)

结果

藏獒被AK47攻击了,掉血40,还剩血量60...
藏獒被AK47攻击了,掉血40,还剩血量20...